<?xml version="1.0" encoding="utf-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Форум программистов и сисадминов Киберфорум - Блоги - edmonsur</title>
		<link>https://www.cyberforum.ru/blogs/1794766/</link>
		<description>КиберФорум - форум программистов, системных администраторов, администраторов баз данных, компьютерный форум, форум по электронике и бытовой технике, обсуждение софта. Бесплатная помощь в решении задач по программированию и наукам, решение проблем с компьютером, операционными системам</description>
		<language>ru</language>
		<lastBuildDate>Tue, 12 May 2026 04:42:14 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>60</ttl>
		<image>
			<url>https://www.cyberforum.ru//cyberstatic.net/images/misc/rss.jpg</url>
			<title>Форум программистов и сисадминов Киберфорум - Блоги - edmonsur</title>
			<link>https://www.cyberforum.ru/blogs/1794766/</link>
		</image>
		<item>
			<title>VB.NET Динамическая загрузка WebView2 контрола в ваш проект (часть 2)</title>
			<link>https://www.cyberforum.ru/blogs/1794766/10621.html</link>
			<pubDate>Fri, 10 Oct 2025 01:06:15 GMT</pubDate>
			<description>часть 1 (https://www.cyberforum.ru/blogs/1794766/10620.html) 
 
В первой части мы уже создали...</description>
			<content:encoded><![CDATA[<div><a href="https://www.cyberforum.ru/blogs/1794766/10620.html">часть 1</a><br />
<br />
В первой части мы уже создали структуру директорий и распаковали туда наши зависимости <br />
<br />
Теперь приступаем к их динамической загрузке <br />
<br />
Мы имеем 3 файла, два это управляемые сборки &quot;Microsoft.Web.WebView2.Core.dll&quot; &quot;Microsoft.Web.WebView2.WinForms.dll &quot;<br />
и одна нативная &quot;WebView2Loader.dll&quot; неуправляемая. По этому загружать их в проект будем  по разному.<br />
<br />
Для этого добавим в наш класс DynamicWebView2Loader приватный класс &quot;NativeMethods&quot; с двумя нативными методами Windows API<br />
<br />
<br />
<div class="codeblock"><table class="vbnet"><thead><tr><td colspan="2" id="664998588"  class="head">VB.NET</td></tr></thead><tbody><tr class="li1"><td><div id="664998588" style="height: 174px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; <span class="kw1">Private</span> <span class="kw1">Class</span> NativeMethods
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">&lt;</span>DllImport<span class="br0">&#40;</span><span class="st0">&quot;kernel32.dll&quot;</span>, CharSet:<span class="sy0">=</span>CharSet<span class="sy0">.</span><span class="me1">Unicode</span>, SetLastError:<span class="sy0">=</span><span class="kw1">True</span><span class="br0">&#41;</span><span class="sy0">&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Public</span> <span class="kw1">Shared</span> <span class="kw1">Function</span> AddDllDirectory<span class="br0">&#40;</span>path <span class="kw1">As</span> <span class="kw2">String</span><span class="br0">&#41;</span> <span class="kw1">As</span> IntPtr
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Function</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">&lt;</span>DllImport<span class="br0">&#40;</span><span class="st0">&quot;kernel32.dll&quot;</span>, CharSet:<span class="sy0">=</span>CharSet<span class="sy0">.</span><span class="me1">Unicode</span>, SetLastError:<span class="sy0">=</span><span class="kw1">True</span><span class="br0">&#41;</span><span class="sy0">&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Public</span> <span class="kw1">Shared</span> <span class="kw1">Function</span> LoadLibrary<span class="br0">&#40;</span>lpFileName <span class="kw1">As</span> <span class="kw2">String</span><span class="br0">&#41;</span> <span class="kw1">As</span> IntPtr
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Function</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Class</span></pre></td></tr></table></div></td></tr></tbody></table></div>Так же напишем метод регистрации для библиотек... &quot;AutoReg&quot; и вызовем его в процедуре &quot;New&quot; после остального кода<br />
<br />
    ' Загружает нативные и управляемые библиотеки WebView2<br />
<div class="codeblock"><table class="vbnet"><thead><tr><td colspan="2" id="72730813"  class="head">VB.NET</td></tr></thead><tbody><tr class="li1"><td><div id="72730813" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp;<span class="kw1">Private</span> <span class="kw1">Sub</span> AutoReg<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">' Загрузка нативной DLL через Windows API</span>
&nbsp;
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">Dim</span> result <span class="kw1">As</span> IntPtr <span class="sy0">=</span> NativeMethods<span class="sy0">.</span><span class="me1">AddDllDirectory</span><span class="br0">&#40;</span>Path<span class="sy0">.</span><span class="me1">GetDirectoryName</span><span class="br0">&#40;</span>LibFiles<span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">If</span> result <span class="sy0">=</span> IntPtr<span class="sy0">.</span><span class="me1">Zero</span> <span class="kw1">Then</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">Dim</span> errorCode <span class="sy0">=</span> Marshal<span class="sy0">.</span><span class="me1">GetLastWin32Error</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ShowCriticalError<span class="br0">&#40;</span>$<span class="st0">&quot;Ошибка AddDllDirectory: код ошибки {errorCode}&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">End</span> <span class="kw1">If</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">Dim</span> libraryHandle <span class="kw1">As</span> IntPtr <span class="sy0">=</span> NativeMethods<span class="sy0">.</span><span class="me1">LoadLibrary</span><span class="br0">&#40;</span>LibFiles<span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">If</span> libraryHandle <span class="sy0">=</span> IntPtr<span class="sy0">.</span><span class="me1">Zero</span> <span class="kw1">Then</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">Dim</span> errorCode <span class="sy0">=</span> Marshal<span class="sy0">.</span><span class="me1">GetLastWin32Error</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ShowCriticalError<span class="br0">&#40;</span>$<span class="st0">&quot;Ошибка LoadLibrary: код ошибки {errorCode}&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">End</span> <span class="kw1">If</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">' Загрузка управляемых сборок через Reflection</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp;CoreAssembly <span class="sy0">=</span> Assembly<span class="sy0">.</span><span class="me1">LoadFrom</span><span class="br0">&#40;</span>LibFiles<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">If</span> CoreAssembly <span class="kw1">Is</span> <span class="kw1">Nothing</span> <span class="kw1">Then</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ShowCriticalError<span class="br0">&#40;</span><span class="st0">&quot;Сборка WebView2 Core не загружена&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">End</span> <span class="kw1">If</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp;WinFormsAssembly <span class="sy0">=</span> Assembly<span class="sy0">.</span><span class="me1">LoadFrom</span><span class="br0">&#40;</span>LibFiles<span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">If</span> WinFormsAssembly <span class="kw1">Is</span> <span class="kw1">Nothing</span> <span class="kw1">Then</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ShowCriticalError<span class="br0">&#40;</span><span class="st0">&quot;Сборка WebView2 WinForms не загружена&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">End</span> <span class="kw1">If</span>
&nbsp;
&nbsp; &nbsp;<span class="kw1">End</span> <span class="kw1">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div>Так же нам понадобятся два новых приватных поля <br />
<div class="codeblock"><table class="vbnet"><thead><tr><td colspan="2" id="459032636"  class="head">VB.NET</td></tr></thead><tbody><tr class="li1"><td><div id="459032636" style="height: 62px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; <span class="kw1">Public</span> CoreAssembly <span class="kw1">As</span> Assembly
&nbsp; &nbsp; <span class="kw1">Public</span> WinFormsAssembly <span class="kw1">As</span> Assembly</pre></td></tr></table></div></td></tr></tbody></table></div><br />
на данном этапе проект будет выглядит так<br />
<br />
 <br />
<div class="codeblock"><table class="vbnet"><thead><tr><td colspan="2" id="905424388"  class="head">VB.NET</td></tr></thead><tbody><tr class="li1"><td><div id="905424388" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
</pre></td><td class="de1"><pre class="de1"><span class="kw1">Imports</span> System<span class="sy0">.</span><span class="me1">IO</span>
<span class="kw1">Imports</span> System<span class="sy0">.</span><span class="me1">IO</span><span class="sy0">.</span><span class="me1">Compression</span>
<span class="kw1">Imports</span> System<span class="sy0">.</span><span class="me1">Reflection</span>
<span class="kw1">Imports</span> System<span class="sy0">.</span><span class="me1">Runtime</span><span class="sy0">.</span><span class="me1">InteropServices</span>
&nbsp;
<span class="kw1">Public</span> <span class="kw1">Class</span> DynamicWebView2Loader
&nbsp; &nbsp; <span class="kw1">Private</span> <span class="kw1">ReadOnly</span> isDevelopment <span class="kw1">As</span> <span class="kw2">Boolean</span> <span class="sy0">=</span> <span class="kw1">True</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">Private</span> LibFiles <span class="kw1">As</span> <span class="kw2">String</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="co1">' это сгенерированный массив в котором хранятся &nbsp; прямые ссылки на файлы зависимостей</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">Public</span> CoreAssembly <span class="kw1">As</span> Assembly
&nbsp;
&nbsp; &nbsp; <span class="kw1">Public</span> WinFormsAssembly <span class="kw1">As</span> Assembly
&nbsp; &nbsp; <span class="kw1">Private</span> <span class="kw1">Sub</span> ShowCriticalError<span class="br0">&#40;</span>message <span class="kw1">As</span> <span class="kw2">String</span>, <span class="kw1">Optional</span> ex <span class="kw1">As</span> Exception <span class="sy0">=</span> <span class="kw1">Nothing</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> errorMessage <span class="kw1">As</span> <span class="kw2">String</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">If</span> isDevelopment <span class="kw1">Then</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; errorMessage <span class="sy0">=</span> $<span class="st0">&quot;{message}{vbCrLf}{If(ex IsNot Nothing, &quot;</span>Детали: <span class="st0">&quot; &amp; ex.ToString(), &quot;</span>Детали отсутствуют<span class="st0">&quot;)}&quot;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Else</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; errorMessage <span class="sy0">=</span> $<span class="st0">&quot;Дальнейшее выполнение программы невозможно.{vbCrLf}Обратитесь в службу поддержки.&quot;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">If</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; MessageBox<span class="sy0">.</span><span class="me1">Show</span><span class="br0">&#40;</span>errorMessage, <span class="st0">&quot;Критическая ошибка&quot;</span>, MessageBoxButtons<span class="sy0">.</span><span class="me1">OK</span>, MessageBoxIcon<span class="sy0">.</span><span class="kw1">Error</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; Application<span class="sy0">.</span><span class="kw1">Exit</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Sub</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">Public</span> <span class="kw1">Sub</span> <span class="kw1">New</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">' приступаем к формированию ссылок </span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> resName <span class="kw1">As</span> <span class="kw2">String</span> <span class="sy0">=</span> NameOf<span class="br0">&#40;</span>My<span class="sy0">.</span><span class="me1">Resources</span><span class="sy0">.</span>_2_1_0_3537_50<span class="br0">&#41;</span><span class="sy0">.</span><span class="me1">TrimStart</span><span class="br0">&#40;</span><span class="st0">&quot;_&quot;</span>c<span class="br0">&#41;</span><span class="sy0">.</span><span class="kw7">Replace</span><span class="br0">&#40;</span><span class="st0">&quot;_&quot;</span>c, <span class="st0">&quot;.&quot;</span>c<span class="br0">&#41;</span> <span class="co1">' так только ленивые делают, вроде меня;) </span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> libDir <span class="kw1">As</span> <span class="kw2">String</span> <span class="sy0">=</span> Path<span class="sy0">.</span><span class="me1">Combine</span><span class="br0">&#40;</span>Environment<span class="sy0">.</span><span class="me1">GetFolderPath</span><span class="br0">&#40;</span>Environment<span class="sy0">.</span><span class="me1">SpecialFolder</span><span class="sy0">.</span><span class="me1">LocalApplicationData</span><span class="br0">&#41;</span>, <span class="kw1">Me</span><span class="sy0">.</span><span class="kw1">GetType</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="me1">Name</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> verDir <span class="kw1">As</span> <span class="kw2">String</span> <span class="sy0">=</span> libDir <span class="sy0">&amp;</span> Path<span class="sy0">.</span><span class="me1">DirectorySeparatorChar</span> <span class="sy0">&amp;</span> resName
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> ldrDir <span class="kw1">As</span> <span class="kw2">String</span> <span class="sy0">=</span> Path<span class="sy0">.</span><span class="me1">Combine</span><span class="br0">&#40;</span>verDir, <span class="st0">&quot;runtimes&quot;</span>, <span class="st0">&quot;win-x86&quot;</span>, <span class="st0">&quot;native&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">' &nbsp;ссылки на папки сформированы... пора их создать, если они конечно ещё не существуют</span>
&nbsp; &nbsp; &nbsp; &nbsp; Directory<span class="sy0">.</span><span class="me1">CreateDirectory</span><span class="br0">&#40;</span>libDir<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; Directory<span class="sy0">.</span><span class="me1">CreateDirectory</span><span class="br0">&#40;</span>verDir<span class="br0">&#41;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; LibFiles <span class="sy0">=</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Path<span class="sy0">.</span><span class="me1">Combine</span><span class="br0">&#40;</span>verDir, <span class="st0">&quot;Microsoft.Web.WebView2.Core.dll&quot;</span><span class="br0">&#41;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Path<span class="sy0">.</span><span class="me1">Combine</span><span class="br0">&#40;</span>verDir, <span class="st0">&quot;Microsoft.Web.WebView2.WinForms.dll&quot;</span><span class="br0">&#41;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Path<span class="sy0">.</span><span class="me1">Combine</span><span class="br0">&#40;</span>ldrDir, <span class="st0">&quot;WebView2Loader.dll&quot;</span><span class="br0">&#41;</span><span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">' проверим и если файлы не сушествуют... распаковываем их из ресурсов </span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">If</span> <span class="kw1">Not</span> FilesExist<span class="br0">&#40;</span>LibFiles<span class="br0">&#41;</span> <span class="kw1">Then</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Extract<span class="br0">&#40;</span>verDir, My<span class="sy0">.</span><span class="me1">Resources</span><span class="sy0">.</span>_2_1_0_3537_50<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">If</span>
&nbsp; &nbsp; &nbsp; &nbsp; AutoReg<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Sub</span>
&nbsp;
&nbsp;
&nbsp;
&nbsp; &nbsp; <span class="kw1">Private</span> <span class="kw1">Function</span> FilesExist<span class="br0">&#40;</span>stringmassive <span class="kw1">As</span> <span class="kw2">String</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw1">As</span> <span class="kw2">Boolean</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Try</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Return</span> stringmassive<span class="sy0">.</span><span class="me1">All</span><span class="br0">&#40;</span><span class="kw1">Function</span><span class="br0">&#40;</span>f<span class="br0">&#41;</span> File<span class="sy0">.</span><span class="me1">Exists</span><span class="br0">&#40;</span>f<span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Catch</span> ex <span class="kw1">As</span> Exception
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Return</span> <span class="kw1">False</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Try</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Function</span>
&nbsp;
&nbsp;
&nbsp; &nbsp; <span class="kw1">Private</span> <span class="kw1">Sub</span> Extract<span class="br0">&#40;</span>destinationDirectoryName <span class="kw1">As</span> <span class="kw2">String</span>, buffer <span class="kw1">As</span> <span class="kw2">Byte</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Try</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Using</span> archive <span class="sy0">=</span> <span class="kw1">New</span> ZipArchive<span class="br0">&#40;</span><span class="kw1">New</span> MemoryStream<span class="br0">&#40;</span>buffer<span class="br0">&#41;</span>, ZipArchiveMode<span class="sy0">.</span><span class="me1">Read</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; archive<span class="sy0">.</span><span class="me1">ExtractToDirectory</span><span class="br0">&#40;</span>destinationDirectoryName<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Using</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Catch</span> ex <span class="kw1">As</span> Exception
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ShowCriticalError<span class="br0">&#40;</span><span class="st0">&quot;Ошибка распаковки&quot;</span>, ex<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Try</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Sub</span>
&nbsp; &nbsp; <span class="kw1">Private</span> <span class="kw1">Class</span> NativeMethods
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">&lt;</span>DllImport<span class="br0">&#40;</span><span class="st0">&quot;kernel32.dll&quot;</span>, CharSet:<span class="sy0">=</span>CharSet<span class="sy0">.</span><span class="me1">Unicode</span>, SetLastError:<span class="sy0">=</span><span class="kw1">True</span><span class="br0">&#41;</span><span class="sy0">&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Public</span> <span class="kw1">Shared</span> <span class="kw1">Function</span> AddDllDirectory<span class="br0">&#40;</span>path <span class="kw1">As</span> <span class="kw2">String</span><span class="br0">&#41;</span> <span class="kw1">As</span> IntPtr
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Function</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">&lt;</span>DllImport<span class="br0">&#40;</span><span class="st0">&quot;kernel32.dll&quot;</span>, CharSet:<span class="sy0">=</span>CharSet<span class="sy0">.</span><span class="me1">Unicode</span>, SetLastError:<span class="sy0">=</span><span class="kw1">True</span><span class="br0">&#41;</span><span class="sy0">&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Public</span> <span class="kw1">Shared</span> <span class="kw1">Function</span> LoadLibrary<span class="br0">&#40;</span>lpFileName <span class="kw1">As</span> <span class="kw2">String</span><span class="br0">&#41;</span> <span class="kw1">As</span> IntPtr
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Function</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Class</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">Private</span> <span class="kw1">Sub</span> AutoReg<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">' Загрузка нативной DLL через Windows API</span>
&nbsp;
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> result <span class="kw1">As</span> IntPtr <span class="sy0">=</span> NativeMethods<span class="sy0">.</span><span class="me1">AddDllDirectory</span><span class="br0">&#40;</span>Path<span class="sy0">.</span><span class="me1">GetDirectoryName</span><span class="br0">&#40;</span>LibFiles<span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">If</span> result <span class="sy0">=</span> IntPtr<span class="sy0">.</span><span class="me1">Zero</span> <span class="kw1">Then</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> errorCode <span class="sy0">=</span> Marshal<span class="sy0">.</span><span class="me1">GetLastWin32Error</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ShowCriticalError<span class="br0">&#40;</span>$<span class="st0">&quot;Ошибка AddDllDirectory: код ошибки {errorCode}&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">If</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> libraryHandle <span class="kw1">As</span> IntPtr <span class="sy0">=</span> NativeMethods<span class="sy0">.</span><span class="me1">LoadLibrary</span><span class="br0">&#40;</span>LibFiles<span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">If</span> libraryHandle <span class="sy0">=</span> IntPtr<span class="sy0">.</span><span class="me1">Zero</span> <span class="kw1">Then</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> errorCode <span class="sy0">=</span> Marshal<span class="sy0">.</span><span class="me1">GetLastWin32Error</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ShowCriticalError<span class="br0">&#40;</span>$<span class="st0">&quot;Ошибка LoadLibrary: код ошибки {errorCode}&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">If</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">' Загрузка управляемых сборок через Reflection</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; CoreAssembly <span class="sy0">=</span> Assembly<span class="sy0">.</span><span class="me1">LoadFrom</span><span class="br0">&#40;</span>LibFiles<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">If</span> CoreAssembly <span class="kw1">Is</span> <span class="kw1">Nothing</span> <span class="kw1">Then</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ShowCriticalError<span class="br0">&#40;</span><span class="st0">&quot;Сборка WebView2 Core не загружена&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">If</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; WinFormsAssembly <span class="sy0">=</span> Assembly<span class="sy0">.</span><span class="me1">LoadFrom</span><span class="br0">&#40;</span>LibFiles<span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">If</span> WinFormsAssembly <span class="kw1">Is</span> <span class="kw1">Nothing</span> <span class="kw1">Then</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ShowCriticalError<span class="br0">&#40;</span><span class="st0">&quot;Сборка WebView2 WinForms не загружена&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">If</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Sub</span>
<span class="kw1">End</span> <span class="kw1">Class</span></pre></td></tr></table></div></td></tr></tbody></table></div>запустим наш проект и посмотри... возникнут ошибки или нет... если нет.. приступаем к созданию WebView2 контрола<br />
<br />
Для этого создадим два новых приватных поля <br />
<br />
<div class="codeblock"><table class="vbnet"><thead><tr><td colspan="2" id="550442053"  class="head">VB.NET</td></tr></thead><tbody><tr class="li1"><td><div id="550442053" style="height: 62px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
</pre></td><td class="de1"><pre class="de1"><span class="kw1">Public</span> webView2Type <span class="kw1">As</span> Type
<span class="kw1">Public</span> WebView2Control</pre></td></tr></table></div></td></tr></tbody></table></div>и напишем процедуру для создания WebView2 контрола &quot;CreateWebView2Control&quot; и вызовем её в процедуре &quot;New&quot;<br />
<br />
<br />
<div class="codeblock"><table class="vbnet"><thead><tr><td colspan="2" id="966555386"  class="head">VB.NET</td></tr></thead><tbody><tr class="li1"><td><div id="966555386" style="height: 254px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; <span class="kw1">Private</span> <span class="kw1">Sub</span> CreateWebView2Control<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">' Получаем тип WebView2 контрола из сборки WinForms</span>
&nbsp; &nbsp; &nbsp; &nbsp; webView2Type <span class="sy0">=</span> WinFormsAssembly<span class="sy0">.</span><span class="kw1">GetType</span><span class="br0">&#40;</span><span class="st0">&quot;Microsoft.Web.WebView2.WinForms.WebView2&quot;</span>, <span class="kw1">True</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">If</span> webView2Type <span class="kw1">Is</span> <span class="kw1">Nothing</span> <span class="kw1">Then</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ShowCriticalError<span class="br0">&#40;</span><span class="st0">&quot;Не удалось получить тип WebView2 контрола из сборки&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">If</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">' Создаем экземпляр контрола через рефлексию</span>
&nbsp; &nbsp; &nbsp; &nbsp; WebView2Control <span class="sy0">=</span> <span class="kw4">CType</span><span class="br0">&#40;</span>Activator<span class="sy0">.</span><span class="me1">CreateInstance</span><span class="br0">&#40;</span>webView2Type<span class="br0">&#41;</span>, Control<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">If</span> WebView2Control <span class="kw1">Is</span> <span class="kw1">Nothing</span> <span class="kw1">Then</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ShowCriticalError<span class="br0">&#40;</span><span class="st0">&quot;Не удалось создать экземпляр WebView2 контрола&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">If</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div>Запускаем проект и если нет ошибок продолжаем... <br />
Напишем публичную асинхронную функцию &quot;InitializeWebView2Async&quot; для инициализации среды WebView2<br />
Напишем публичную процедуру &quot;Navigate&quot; <br />
<br />
 <div class="codeblock"><table class="vbnet"><thead><tr><td colspan="2" id="53918058"  class="head">VB.NET</td></tr></thead><tbody><tr class="li1"><td><div id="53918058" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp;<span class="kw1">Public</span> Async <span class="kw1">Function</span> InitializeWebView2Async<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">As</span> Task
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Try</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">' Создаем среду выполнения WebView2</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> environmentType <span class="sy0">=</span> CoreAssembly<span class="sy0">.</span><span class="kw1">GetType</span><span class="br0">&#40;</span><span class="st0">&quot;Microsoft.Web.WebView2.Core.CoreWebView2Environment&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">If</span> environmentType <span class="kw1">Is</span> <span class="kw1">Nothing</span> <span class="kw1">Then</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ShowCriticalError<span class="br0">&#40;</span><span class="st0">&quot;Не удалось найти тип CoreWebView2Environment&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">If</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">' Ищем метод CreateAsync для асинхронного создания среды</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> createAsyncMethod <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw5">From</span> m <span class="kw1">In</span> environmentType<span class="sy0">.</span><span class="me1">GetMethods</span><span class="br0">&#40;</span>BindingFlags<span class="sy0">.</span><span class="kw1">Public</span> <span class="kw1">Or</span> BindingFlags<span class="sy0">.</span><span class="kw1">Static</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw5">Where</span> m<span class="sy0">.</span><span class="me1">Name</span> <span class="sy0">=</span> <span class="st0">&quot;CreateAsync&quot;</span> <span class="kw1">AndAlso</span> m<span class="sy0">.</span><span class="me1">GetParameters</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="me1">Length</span> <span class="sy0">=</span> <span class="nu0">3</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">Select</span> m<span class="br0">&#41;</span><span class="sy0">.</span><span class="me1">FirstOrDefault</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">If</span> createAsyncMethod <span class="kw1">Is</span> <span class="kw1">Nothing</span> <span class="kw1">Then</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ShowCriticalError<span class="br0">&#40;</span><span class="st0">&quot;Метод CreateAsync не найден в CoreWebView2Environment&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">If</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">' Создаем временную директорию для кэша WebView2</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> _appCachePath <span class="sy0">=</span> Path<span class="sy0">.</span><span class="me1">Combine</span><span class="br0">&#40;</span>Path<span class="sy0">.</span><span class="me1">GetTempPath</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="st0">&quot;WebView2App&quot;</span><span class="br0">&#41;</span>
&nbsp;
&nbsp;
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Directory<span class="sy0">.</span><span class="me1">CreateDirectory</span><span class="br0">&#40;</span>_appCachePath<span class="br0">&#41;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">' Асинхронно создаем среду выполнения</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> createTask <span class="sy0">=</span> <span class="kw4">CType</span><span class="br0">&#40;</span>createAsyncMethod<span class="sy0">.</span><span class="me1">Invoke</span><span class="br0">&#40;</span><span class="kw1">Nothing</span>, <span class="kw1">New</span> <span class="kw2">Object</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="kw1">Nothing</span>, _appCachePath, <span class="kw1">Nothing</span><span class="br0">&#125;</span><span class="br0">&#41;</span>, Task<span class="br0">&#41;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">' Проверка создания задачи</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">If</span> createTask <span class="kw1">Is</span> <span class="kw1">Nothing</span> <span class="kw1">Then</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ShowCriticalError<span class="br0">&#40;</span><span class="st0">&quot;CreateAsync не вернул задачу&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">If</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Await createTask
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> environment <span class="sy0">=</span> createTask<span class="sy0">.</span><span class="kw1">GetType</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="me1">GetProperty</span><span class="br0">&#40;</span><span class="st0">&quot;Result&quot;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="me1">GetValue</span><span class="br0">&#40;</span>createTask<span class="br0">&#41;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">' Проверка результата</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">If</span> environment <span class="kw1">Is</span> <span class="kw1">Nothing</span> <span class="kw1">Then</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ShowCriticalError<span class="br0">&#40;</span><span class="st0">&quot;Среда выполнения WebView2 не была создана&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">If</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">' Теперь инициализируем CoreWebView2 контрола с созданной средой</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> ensureMethod <span class="sy0">=</span> webView2Type<span class="sy0">.</span><span class="me1">GetMethod</span><span class="br0">&#40;</span><span class="st0">&quot;EnsureCoreWebView2Async&quot;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; BindingFlags<span class="sy0">.</span><span class="kw1">Public</span> <span class="kw1">Or</span> BindingFlags<span class="sy0">.</span><span class="me1">Instance</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Nothing</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">New</span> Type<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>environmentType<span class="br0">&#125;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Nothing</span><span class="br0">&#41;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">If</span> ensureMethod <span class="kw1">Is</span> <span class="kw1">Nothing</span> <span class="kw1">Then</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ShowCriticalError<span class="br0">&#40;</span><span class="st0">&quot;Метод EnsureCoreWebView2Async не найден&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">If</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> ensureTask <span class="sy0">=</span> <span class="kw4">CType</span><span class="br0">&#40;</span>ensureMethod<span class="sy0">.</span><span class="me1">Invoke</span><span class="br0">&#40;</span>WebView2Control, <span class="kw1">New</span> <span class="kw2">Object</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>environment<span class="br0">&#125;</span><span class="br0">&#41;</span>, Task<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Await ensureTask
&nbsp;
&nbsp;
&nbsp;
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Catch</span> ex <span class="kw1">As</span> Exception
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ShowCriticalError<span class="br0">&#40;</span><span class="st0">&quot;Ошибка инициализации WebView2:&quot;</span>, ex<span class="br0">&#41;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Try</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Function</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">' Выполняет навигацию к указанному URL</span>
&nbsp; &nbsp; <span class="kw1">Public</span> <span class="kw1">Sub</span> Navigate<span class="br0">&#40;</span>url <span class="kw1">As</span> <span class="kw2">String</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Try</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> sourceProp <span class="sy0">=</span> webView2Type<span class="sy0">.</span><span class="me1">GetProperty</span><span class="br0">&#40;</span><span class="st0">&quot;Source&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">If</span> sourceProp <span class="kw1">Is</span> <span class="kw1">Nothing</span> <span class="kw1">Then</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ShowCriticalError<span class="br0">&#40;</span><span class="st0">&quot;Свойство Source не найдено в WebView2 контроле&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">If</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sourceProp<span class="sy0">.</span><span class="me1">SetValue</span><span class="br0">&#40;</span>WebView2Control, <span class="kw1">New</span> Uri<span class="br0">&#40;</span>url<span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Catch</span> ex <span class="kw1">As</span> Exception
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ShowCriticalError<span class="br0">&#40;</span>$<span class="st0">&quot;Ошибка навигации в WebView2&quot;</span>, ex<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Try</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div>Затем подправим код Form1 <br />
<br />
<div class="codeblock"><table class="vbnet"><thead><tr><td colspan="2" id="102995891"  class="head">VB.NET</td></tr></thead><tbody><tr class="li1"><td><div id="102995891" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="de1"><pre class="de1"><span class="kw1">Public</span> <span class="kw1">Class</span> Form1
&nbsp; &nbsp; <span class="kw1">Private</span> Browser <span class="kw1">As</span> DynamicWebView2Loader
&nbsp;
&nbsp; &nbsp; <span class="kw1">Public</span> <span class="kw1">Sub</span> <span class="kw1">New</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">' Dieser Aufruf ist für den Designer erforderlich.</span>
&nbsp; &nbsp; &nbsp; &nbsp; InitializeComponent<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; Browser <span class="sy0">=</span> <span class="kw1">New</span> DynamicWebView2Loader
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Me</span><span class="sy0">.</span><span class="me1">Controls</span><span class="sy0">.</span><span class="me1">Add</span><span class="br0">&#40;</span>Browser<span class="sy0">.</span><span class="me1">WebView2Control</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; Browser<span class="sy0">.</span><span class="me1">WebView2Control</span><span class="sy0">.</span><span class="me1">Dock</span> <span class="sy0">=</span> DockStyle<span class="sy0">.</span><span class="me1">Fill</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Sub</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">Private</span> Async <span class="kw1">Sub</span> Form1_Load<span class="br0">&#40;</span>sender <span class="kw1">As</span> <span class="kw2">Object</span>, e <span class="kw1">As</span> EventArgs<span class="br0">&#41;</span> <span class="kw1">Handles</span> <span class="kw1">MyBase</span><span class="sy0">.</span><span class="me1">Load</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; Await Browser<span class="sy0">.</span><span class="me1">InitializeWebView2Async</span>
&nbsp; &nbsp; &nbsp; &nbsp; Browser<span class="sy0">.</span><span class="me1">Navigate</span><span class="br0">&#40;</span><span class="st0">&quot;https://www.cyberforum.ru/blogs/1794766/10620.html&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Sub</span>
<span class="kw1">End</span> <span class="kw1">Class</span></pre></td></tr></table></div></td></tr></tbody></table></div><br />
запускаем наш проект... всё получилось и работает. Конечно класс DynamicWebView2Loader нужно ещё доработать, но фундамент уже есть.  Полный код лежит в вложениях...  дерзайте</div>


<!-- attachments -->
	<div style="margin-top:10px">

		
		
		
		
			<fieldset class="fieldset">
				<legend>Вложения</legend>
				<table cellpadding="0" cellspacing="3" border="0">
				<tr>
	<td><img loading="lazy" decoding="async" class="inlineimg" src="http://www.cyberforum.ru//cyberstatic.net/images/attach/zip.gif" alt="Тип файла: zip" width="16" height="16" border="0" style="vertical-align:baseline" /></td>
	<td><a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=11277&amp;d=1760058359">Resources.zip</a> (733.5 Кб, 147 просмотров)</td>
</tr>
				</table>
			</fieldset>
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>edmonsur</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1794766/10621.html</guid>
		</item>
		<item>
			<title>VB.NET Динамическая загрузка WebView2 контрола в ваш проект (часть 1)</title>
			<link>https://www.cyberforum.ru/blogs/1794766/10620.html</link>
			<pubDate>Thu, 09 Oct 2025 19:09:54 GMT</pubDate>
			<description>Те, кто используют WebView2 в своих проектах, знают, что, каким бы хорошим ни был этот элемент,...</description>
			<content:encoded><![CDATA[<div>Те, кто используют WebView2 в своих проектах, знают, что, каким бы хорошим ни был этот элемент, самым большим недостатком является то, что придётся таскать эту зависимость (при любом раскладе) с собой. А это немало ни много — около 2 мегабайт библиотек. Целью проекта, который я вам хочу представить, было сокращение размеров балласта. На выходе мы получаем чистый EXE-файл с встроенным  WebView2 элементом и запакованными в него зависимостями, размер которого будет меньше 1 мегабайта.<br />
<br />
Для этого мы напишем класс с названием DynamicWebView2Loader... который вы сможете использовать в своих проектах там, где вам понадобится браузер с поддержкой HTML5, CSS и всех остальных плюшек (не буду всё перечислять).<br />
<br />
Итак, приступим.<br />
<br />
Для того чтобы использовать элемент WebView2 в своём проекте, Visual Studio предлагает через NuGet установить данную зависимость. Но мы пойдём другим путём: самостоятельно скачаем WebView2 NuGet-пакет и возьмём из него только то, что нам нужно.<br />
<br />
забиваем в браузер &quot;webview2 nuget&quot;  ну или проходим по ссылке <a rel="nofollow noopener noreferrer" href="https://www.nuget.org/packages/microsoft.web.webview2" target="_blank" title="https://www.nuget.org/packages/microsoft.web.webview2">https://www.nuget.org/packages... b.webview2</a> нажимаем в меню с права  на &quot;Download package&quot; и скачиваем. <br />
<br />
Заходим в загрузки и видим <br />
microsoft.web.webview2.1.0.3537.50.nupkg<br />
<br />
Переименовываем этот пакет в microsoft.web.webview2.1.0.3537.50.zip и распаковываем. <br />
<br />
Создадим новую директорию (например на рабочем столе) и назовём &quot;2.1.0.3537.50&quot; это нужно для того что бы мы знали какая версия пакета используется в проекте. <br />
<br />
Заходим в распакованную папку microsoft.web.webview2.1.0.3537.50 в папку lib\net462\ и копируем из неё 2 файла Microsoft.Web.WebView2.Core.dll и Microsoft.Web.WebView2.WinForms.dll в ново созданную папку &quot;2.1.0.3537.50&quot;<br />
<br />
так же ... скопируйте из папки microsoft.web.webview2.1.0.3537.50 папку &quot;runtimes&quot; в папку &quot;2.1.0.3537.50&quot; <br />
<br />
<br />
<br />
<br />
в папке &quot;runtimes&quot; нужно удалить всё кроме папки win-x86, native и её вложения файла WebView2Loader.dll<br />
на выходе у нас должна получиться папка  &quot;2.1.0.3537.50&quot; с данной структурой <br />
<br />
&quot;2.1.0.3537.50&quot;<br />
        |---- Microsoft.Web.WebView2.Core.dll<br />
        |---- Microsoft.Web.WebView2.WinForms.dll<br />
        |---------runtimes<br />
                     --------|--------------win-x86 <br />
                                -----------------|--------- native <br />
                                          ----------------------------|----------  WebView2Loader.dll<br />
<br />
<br />
выделяем всё  содержимое в папке &quot;2.1.0.3537.50&quot; нажимаем на правую   кнопку мыши и  выбираем в открывшимся меню &quot;компримировать в&quot; выбираем zip Архив<br />
<br />
на выходе имеем 2.1.0.3537.50.zip с (действительно) нужными зависимостями. <br />
<br />
<br />
Теперь открываем Visual Studio и создаём проект  простого .Net приложения. (Название роли не играет)<br />
<br />
После того как проект был загружен. В меню сверху нажимаем на &quot;проект&quot; в открывшимся меню выбираете &quot;свойства проекта&quot;, в открывшимся окне слева жмём на вкладку &quot;ресурсы&quot;, там &quot;добавить ресурсы&quot; и выбираем на рабочем столе в папке &quot;2.1.0.3537.50&quot; наш 2.1.0.3537.50.zip ... готово.. наши зависимости у нас в проекте. <br />
<br />
Опять идём в меню  сверху нажимаем на &quot;проект&quot; выбираем &quot;добавить класс&quot; называем &quot;DynamicWebView2Loader&quot; и создаём<br />
<br />
<div class="codeblock"><table class="vbnet"><thead><tr><td colspan="2" id="155556344"  class="head">VB.NET</td></tr></thead><tbody><tr class="li1"><td><div id="155556344" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1"><span class="kw1">Public</span> <span class="kw1">Class</span> DynamicWebView2Loader
&nbsp;
<span class="kw1">End</span> <span class="kw1">Class</span></pre></td></tr></table></div></td></tr></tbody></table></div>Преступаем к коду<br />
<br />
Первым делом в классе DynamicWebView2Loader создадим пару другую приватные полей  <br />
<br />
первое из них будет Private ReadOnly isDevelopment As Boolean = True это поле нужно для отслеживания ошибок в стадии разработки. Позже когда проект будет полностью готов не забудьте изменить его значение на False (пользователю не нужны детали)<br />
<br />
Теперь напишем первую процедуру ShowCriticalError. Эта процедура в стадии разработки будет показывать нам ошибку (c деталями или без) или если isDevelopment будет = False  уведомлять пользователя о критической ошибке и закрывать приложение. <br />
<br />
<br />
<div class="codeblock"><table class="vbnet"><thead><tr><td colspan="2" id="740379043"  class="head">VB.NET</td></tr></thead><tbody><tr class="li1"><td><div id="740379043" style="height: 270px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="de1"><pre class="de1"><span class="kw1">Public</span> <span class="kw1">Class</span> DynamicWebView2Loader
<span class="kw1">Private</span> <span class="kw1">ReadOnly</span> isDevelopment <span class="kw1">As</span> <span class="kw2">Boolean</span> <span class="sy0">=</span> <span class="kw1">True</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">Private</span> <span class="kw1">Sub</span> ShowCriticalError<span class="br0">&#40;</span>message <span class="kw1">As</span> <span class="kw2">String</span>, <span class="kw1">Optional</span> ex <span class="kw1">As</span> Exception <span class="sy0">=</span> <span class="kw1">Nothing</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> errorMessage <span class="kw1">As</span> <span class="kw2">String</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">If</span> isDevelopment <span class="kw1">Then</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; errorMessage <span class="sy0">=</span> $<span class="st0">&quot;{message}{vbCrLf}{If(ex IsNot Nothing, &quot;</span>Детали: <span class="st0">&quot; &amp; ex.ToString(), &quot;</span>Детали отсутствуют<span class="st0">&quot;)}&quot;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Else</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; errorMessage <span class="sy0">=</span> $<span class="st0">&quot;Дальнейшее выполнение программы невозможно.{vbCrLf}Обратитесь в службу поддержки.&quot;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">If</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; MessageBox<span class="sy0">.</span><span class="me1">Show</span><span class="br0">&#40;</span>errorMessage, <span class="st0">&quot;Критическая ошибка&quot;</span>, MessageBoxButtons<span class="sy0">.</span><span class="me1">OK</span>, MessageBoxIcon<span class="sy0">.</span><span class="kw1">Error</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; Application<span class="sy0">.</span><span class="kw1">Exit</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Sub</span>
<span class="kw1">End</span> <span class="kw1">Class</span></pre></td></tr></table></div></td></tr></tbody></table></div><br />
Идём дальше... Создадим нашу точку входа процедуру NEW и подключим наш класс в контейнер, точнее в Form1<br />
<br />
<br />
<div class="codeblock"><table class="vbnet"><thead><tr><td colspan="2" id="204351482"  class="head">VB.NET</td></tr></thead><tbody><tr class="li1"><td><div id="204351482" style="height: 334px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="de1"><pre class="de1"><span class="kw1">Public</span> <span class="kw1">Class</span> DynamicWebView2Loader
<span class="kw1">Private</span> <span class="kw1">ReadOnly</span> isDevelopment <span class="kw1">As</span> <span class="kw2">Boolean</span> <span class="sy0">=</span> <span class="kw1">True</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">Private</span> <span class="kw1">Sub</span> ShowCriticalError<span class="br0">&#40;</span>message <span class="kw1">As</span> <span class="kw2">String</span>, <span class="kw1">Optional</span> ex <span class="kw1">As</span> Exception <span class="sy0">=</span> <span class="kw1">Nothing</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> errorMessage <span class="kw1">As</span> <span class="kw2">String</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">If</span> isDevelopment <span class="kw1">Then</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; errorMessage <span class="sy0">=</span> $<span class="st0">&quot;{message}{vbCrLf}{If(ex IsNot Nothing, &quot;</span>Детали: <span class="st0">&quot; &amp; ex.ToString(), &quot;</span>Детали отсутствуют<span class="st0">&quot;)}&quot;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Else</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; errorMessage <span class="sy0">=</span> $<span class="st0">&quot;Дальнейшее выполнение программы невозможно.{vbCrLf}Обратитесь в службу поддержки.&quot;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">If</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; MessageBox<span class="sy0">.</span><span class="me1">Show</span><span class="br0">&#40;</span>errorMessage, <span class="st0">&quot;Критическая ошибка&quot;</span>, MessageBoxButtons<span class="sy0">.</span><span class="me1">OK</span>, MessageBoxIcon<span class="sy0">.</span><span class="kw1">Error</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; Application<span class="sy0">.</span><span class="kw1">Exit</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Sub</span>
&nbsp; &nbsp; 
&nbsp; &nbsp; <span class="kw1">Public</span> <span class="kw1">Sub</span> <span class="kw1">New</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp;ShowCriticalError<span class="br0">&#40;</span><span class="st0">&quot;Работает&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Sub</span>
<span class="kw1">End</span> <span class="kw1">Class</span></pre></td></tr></table></div></td></tr></tbody></table></div>код в Form1<br />
<br />
<div class="codeblock"><table class="vbnet"><thead><tr><td colspan="2" id="759293144"  class="head">VB.NET</td></tr></thead><tbody><tr class="li1"><td><div id="759293144" style="height: 174px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
</pre></td><td class="de1"><pre class="de1"><span class="kw1">Public</span> <span class="kw1">Class</span> Form1
&nbsp;
&nbsp; &nbsp; <span class="kw1">Private</span> <span class="kw1">Sub</span> Form1_Load<span class="br0">&#40;</span>sender <span class="kw1">As</span> <span class="kw2">Object</span>, e <span class="kw1">As</span> EventArgs<span class="br0">&#41;</span> <span class="kw1">Handles</span> <span class="kw1">MyBase</span><span class="sy0">.</span><span class="me1">Load</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> Browser <span class="kw1">As</span> <span class="kw1">New</span> DynamicWebView2Loader
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Sub</span>
&nbsp;
<span class="kw1">End</span> <span class="kw1">Class</span></pre></td></tr></table></div></td></tr></tbody></table></div>Запустите приложение...если сделали всё верно... то увидите сообщение и приложение закроется.<br />
<br />
<br />
Продолжаем.... Приступим к созданию папок и для наших зависимостей, и распакуем их туда. Именно от туда (позже) мы будем динамически подключать их к нашему проекту. <br />
<br />
Создадим ещё 1 приватное поле (массив) ... это прямые ссылки на файлы зависимостей. <br />
<br />
(папка Environment.GetFolderPath(Environment.Sp ecialFolder.LocalApplicationData) выбрана не спроста... в ней могут храниться зависимости приложений,  доступна для записи и чтения для данного пользователя, доступна  без прав администратора)<br />
<br />
<br />
 Private  LibFiles As String() <br />
<br />
<br />
<div class="codeblock"><table class="vbnet"><thead><tr><td colspan="2" id="263220959"  class="head">VB.NET</td></tr></thead><tbody><tr class="li1"><td><div id="263220959" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
</pre></td><td class="de1"><pre class="de1"><span class="kw1">Public</span> <span class="kw1">Class</span> DynamicWebView2Loader
<span class="kw1">Private</span> <span class="kw1">ReadOnly</span> isDevelopment <span class="kw1">As</span> <span class="kw2">Boolean</span> <span class="sy0">=</span> <span class="kw1">True</span>
&nbsp;
&nbsp;<span class="kw1">Private</span> &nbsp;LibFiles <span class="kw1">As</span> <span class="kw2">String</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="co1">' это сгенерированный массив в котором хранятся &nbsp; прямые ссылки на файлы зависимостей</span>
&nbsp; &nbsp; 
&nbsp;
&nbsp;
&nbsp;
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Private</span> <span class="kw1">Sub</span> ShowCriticalError<span class="br0">&#40;</span>message <span class="kw1">As</span> <span class="kw2">String</span>, <span class="kw1">Optional</span> ex <span class="kw1">As</span> Exception <span class="sy0">=</span> <span class="kw1">Nothing</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> errorMessage <span class="kw1">As</span> <span class="kw2">String</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">If</span> isDevelopment <span class="kw1">Then</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; errorMessage <span class="sy0">=</span> $<span class="st0">&quot;{message}{vbCrLf}{If(ex IsNot Nothing, &quot;</span>Детали: <span class="st0">&quot; &amp; ex.ToString(), &quot;</span>Детали отсутствуют<span class="st0">&quot;)}&quot;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Else</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; errorMessage <span class="sy0">=</span> $<span class="st0">&quot;Дальнейшее выполнение программы невозможно.{vbCrLf}Обратитесь в службу поддержки.&quot;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">If</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; MessageBox<span class="sy0">.</span><span class="me1">Show</span><span class="br0">&#40;</span>errorMessage, <span class="st0">&quot;Критическая ошибка&quot;</span>, MessageBoxButtons<span class="sy0">.</span><span class="me1">OK</span>, MessageBoxIcon<span class="sy0">.</span><span class="kw1">Error</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; Application<span class="sy0">.</span><span class="kw1">Exit</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Sub</span>
&nbsp; &nbsp; 
&nbsp; &nbsp; <span class="kw1">Public</span> <span class="kw1">Sub</span> <span class="kw1">New</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="co1">' приступаем к формированию ссылок </span>
&nbsp;
&nbsp;<span class="kw1">Dim</span> resName <span class="kw1">As</span> <span class="kw2">String</span> <span class="sy0">=</span> NameOf<span class="br0">&#40;</span>My<span class="sy0">.</span><span class="me1">Resources</span><span class="sy0">.</span>_2_1_0_3537_50<span class="br0">&#41;</span><span class="sy0">.</span><span class="me1">TrimStart</span><span class="br0">&#40;</span><span class="st0">&quot;_&quot;</span>c<span class="br0">&#41;</span><span class="sy0">.</span><span class="kw7">Replace</span><span class="br0">&#40;</span><span class="st0">&quot;_&quot;</span>c, <span class="st0">&quot;.&quot;</span>c<span class="br0">&#41;</span> <span class="co1">' так только ленивые делают, вроде меня;) </span>
&nbsp;<span class="kw1">Dim</span> &nbsp;libDir <span class="kw1">As</span> <span class="kw2">String</span> <span class="sy0">=</span> Path<span class="sy0">.</span><span class="me1">Combine</span><span class="br0">&#40;</span>Environment<span class="sy0">.</span><span class="me1">GetFolderPath</span><span class="br0">&#40;</span>Environment<span class="sy0">.</span><span class="me1">SpecialFolder</span><span class="sy0">.</span><span class="me1">LocalApplicationData</span><span class="br0">&#41;</span>, <span class="kw1">Me</span><span class="sy0">.</span><span class="kw1">GetType</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="me1">Name</span><span class="br0">&#41;</span>
&nbsp;<span class="kw1">Dim</span> verDir <span class="kw1">As</span> <span class="kw2">String</span> <span class="sy0">=</span> libDir <span class="sy0">&amp;</span> Path<span class="sy0">.</span><span class="me1">DirectorySeparatorChar</span> <span class="sy0">&amp;</span> resName
&nbsp;<span class="kw1">Dim</span> ldrDir <span class="kw1">As</span> <span class="kw2">String</span> <span class="sy0">=</span> Path<span class="sy0">.</span><span class="me1">Combine</span><span class="br0">&#40;</span>verDir, <span class="st0">&quot;runtimes&quot;</span>,<span class="st0">&quot;win-x86&quot;</span>, <span class="st0">&quot;native&quot;</span><span class="br0">&#41;</span>
<span class="co1">' &nbsp;ссылки на папки сформированы... пора их создать, если они конечно ещё не существуют</span>
&nbsp; &nbsp; &nbsp; &nbsp; Directory<span class="sy0">.</span><span class="me1">CreateDirectory</span><span class="br0">&#40;</span>libDir<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; Directory<span class="sy0">.</span><span class="me1">CreateDirectory</span><span class="br0">&#40;</span>verDir<span class="br0">&#41;</span>
&nbsp;
LibFiles<span class="sy0">=</span><span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; Path<span class="sy0">.</span><span class="me1">Combine</span><span class="br0">&#40;</span>verDir, <span class="st0">&quot;Microsoft.Web.WebView2.Core.dll&quot;</span><span class="br0">&#41;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; Path<span class="sy0">.</span><span class="me1">Combine</span><span class="br0">&#40;</span>verDir, <span class="st0">&quot;Microsoft.Web.WebView2.WinForms.dll&quot;</span><span class="br0">&#41;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; Path<span class="sy0">.</span><span class="me1">Combine</span><span class="br0">&#40;</span>ldrDir, <span class="st0">&quot;WebView2Loader.dll&quot;</span><span class="br0">&#41;</span><span class="br0">&#125;</span>
<span class="co1">' проверим </span>
&nbsp;
<span class="kw7">MsgBox</span><span class="br0">&#40;</span>LibFiles<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
&nbsp;<span class="kw1">End</span> <span class="kw1">Sub</span>
<span class="kw1">End</span> <span class="kw1">Class</span></pre></td></tr></table></div></td></tr></tbody></table></div>если всё прошло гладко то вы увидите прямую ссылку на Microsoft.Web.WebView2.Core.dll (правда сейчас там ещё нет этого файла, но скоро он там будет)<br />
<br />
<br />
теперь напишем  функцию и процедуру одна будет проверять существование файлов по указанным ссылкам ... другая будет распаковывать из наших ресурсов 2.1.0.3537.50.zip<br />
<br />
<div class="codeblock"><table class="vbnet"><thead><tr><td colspan="2" id="888867305"  class="head">VB.NET</td></tr></thead><tbody><tr class="li1"><td><div id="888867305" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
</pre></td><td class="de1"><pre class="de1"><span class="kw1">Public</span> <span class="kw1">Class</span> DynamicWebView2Loader
<span class="kw1">Private</span> <span class="kw1">ReadOnly</span> isDevelopment <span class="kw1">As</span> <span class="kw2">Boolean</span> <span class="sy0">=</span> <span class="kw1">True</span>
&nbsp;
&nbsp;<span class="kw1">Private</span> &nbsp;LibFiles <span class="kw1">As</span> <span class="kw2">String</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="co1">' это сгенерированный массив в котором хранятся &nbsp; прямые ссылки на файлы зависимостей</span>
&nbsp; &nbsp; 
&nbsp;
&nbsp;
&nbsp;
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Private</span> <span class="kw1">Sub</span> ShowCriticalError<span class="br0">&#40;</span>message <span class="kw1">As</span> <span class="kw2">String</span>, <span class="kw1">Optional</span> ex <span class="kw1">As</span> Exception <span class="sy0">=</span> <span class="kw1">Nothing</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> errorMessage <span class="kw1">As</span> <span class="kw2">String</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">If</span> isDevelopment <span class="kw1">Then</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; errorMessage <span class="sy0">=</span> $<span class="st0">&quot;{message}{vbCrLf}{If(ex IsNot Nothing, &quot;</span>Детали: <span class="st0">&quot; &amp; ex.ToString(), &quot;</span>Детали отсутствуют<span class="st0">&quot;)}&quot;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Else</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; errorMessage <span class="sy0">=</span> $<span class="st0">&quot;Дальнейшее выполнение программы невозможно.{vbCrLf}Обратитесь в службу поддержки.&quot;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">If</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; MessageBox<span class="sy0">.</span><span class="me1">Show</span><span class="br0">&#40;</span>errorMessage, <span class="st0">&quot;Критическая ошибка&quot;</span>, MessageBoxButtons<span class="sy0">.</span><span class="me1">OK</span>, MessageBoxIcon<span class="sy0">.</span><span class="kw1">Error</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; Application<span class="sy0">.</span><span class="kw1">Exit</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Sub</span>
&nbsp; &nbsp; 
&nbsp; &nbsp; <span class="kw1">Public</span> <span class="kw1">Sub</span> <span class="kw1">New</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="co1">' приступаем к формированию ссылок </span>
&nbsp;
&nbsp;<span class="kw1">Dim</span> resName <span class="kw1">As</span> <span class="kw2">String</span> <span class="sy0">=</span> NameOf<span class="br0">&#40;</span>My<span class="sy0">.</span><span class="me1">Resources</span><span class="sy0">.</span>_2_1_0_3537_50<span class="br0">&#41;</span><span class="sy0">.</span><span class="me1">TrimStart</span><span class="br0">&#40;</span><span class="st0">&quot;_&quot;</span>c<span class="br0">&#41;</span><span class="sy0">.</span><span class="kw7">Replace</span><span class="br0">&#40;</span><span class="st0">&quot;_&quot;</span>c, <span class="st0">&quot;.&quot;</span>c<span class="br0">&#41;</span> <span class="co1">' так только ленивые делают, вроде меня;) </span>
&nbsp;<span class="kw1">Dim</span> &nbsp;libDir <span class="kw1">As</span> <span class="kw2">String</span> <span class="sy0">=</span> Path<span class="sy0">.</span><span class="me1">Combine</span><span class="br0">&#40;</span>Environment<span class="sy0">.</span><span class="me1">GetFolderPath</span><span class="br0">&#40;</span>Environment<span class="sy0">.</span><span class="me1">SpecialFolder</span><span class="sy0">.</span><span class="me1">LocalApplicationData</span><span class="br0">&#41;</span>, <span class="kw1">Me</span><span class="sy0">.</span><span class="kw1">GetType</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="me1">Name</span><span class="br0">&#41;</span>
&nbsp;<span class="kw1">Dim</span> verDir <span class="kw1">As</span> <span class="kw2">String</span> <span class="sy0">=</span> libDir <span class="sy0">&amp;</span> Path<span class="sy0">.</span><span class="me1">DirectorySeparatorChar</span> <span class="sy0">&amp;</span> resName
&nbsp;<span class="kw1">Dim</span> ldrDir <span class="kw1">As</span> <span class="kw2">String</span> <span class="sy0">=</span> Path<span class="sy0">.</span><span class="me1">Combine</span><span class="br0">&#40;</span>verDir, <span class="st0">&quot;runtimes&quot;</span>,<span class="st0">&quot;win-x86&quot;</span>, <span class="st0">&quot;native&quot;</span><span class="br0">&#41;</span>
<span class="co1">' &nbsp;ссылки на папки сформированы... пора их создать, если они конечно ещё не существуют</span>
&nbsp; &nbsp; &nbsp; &nbsp; Directory<span class="sy0">.</span><span class="me1">CreateDirectory</span><span class="br0">&#40;</span>libDir<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; Directory<span class="sy0">.</span><span class="me1">CreateDirectory</span><span class="br0">&#40;</span>verDir<span class="br0">&#41;</span>
&nbsp;
LibFiles<span class="sy0">=</span><span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; Path<span class="sy0">.</span><span class="me1">Combine</span><span class="br0">&#40;</span>verDir, <span class="st0">&quot;Microsoft.Web.WebView2.Core.dll&quot;</span><span class="br0">&#41;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; Path<span class="sy0">.</span><span class="me1">Combine</span><span class="br0">&#40;</span>verDir, <span class="st0">&quot;Microsoft.Web.WebView2.WinForms.dll&quot;</span><span class="br0">&#41;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; Path<span class="sy0">.</span><span class="me1">Combine</span><span class="br0">&#40;</span>ldrDir, <span class="st0">&quot;WebView2Loader.dll&quot;</span><span class="br0">&#41;</span><span class="br0">&#125;</span>
<span class="co1">' проверим </span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">If</span> <span class="kw1">Not</span> FilesExist<span class="br0">&#40;</span>LibFiles<span class="br0">&#41;</span> <span class="kw1">Then</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Extract<span class="br0">&#40;</span>verDir, My<span class="sy0">.</span><span class="me1">Resources</span><span class="sy0">.</span>_2_1_0_3537_50<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">If</span>
&nbsp;
&nbsp;<span class="kw1">End</span> <span class="kw1">Sub</span>
&nbsp;
&nbsp;
&nbsp;
&nbsp; &nbsp; <span class="kw1">Private</span> <span class="kw1">Function</span> FilesExist<span class="br0">&#40;</span>stringmassive <span class="kw1">As</span> <span class="kw2">String</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw1">As</span> <span class="kw2">Boolean</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Try</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Return</span> stringmassive<span class="sy0">.</span><span class="me1">All</span><span class="br0">&#40;</span><span class="kw1">Function</span><span class="br0">&#40;</span>file<span class="br0">&#41;</span> IO<span class="sy0">.</span><span class="me1">File</span><span class="sy0">.</span><span class="me1">Exists</span><span class="br0">&#40;</span>file<span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Catch</span> ex <span class="kw1">As</span> Exception
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Return</span> <span class="kw1">False</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Try</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Function</span>
&nbsp; &nbsp; 
&nbsp;
&nbsp; &nbsp; &nbsp; <span class="kw1">Private</span> <span class="kw1">Sub</span> Extract<span class="br0">&#40;</span>destinationDirectoryName <span class="kw1">As</span> <span class="kw2">String</span>, buffer <span class="kw1">As</span> <span class="kw2">Byte</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Try</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Using</span> archive <span class="sy0">=</span> <span class="kw1">New</span> ZipArchive<span class="br0">&#40;</span><span class="kw1">New</span> MemoryStream<span class="br0">&#40;</span>buffer<span class="br0">&#41;</span>, ZipArchiveMode<span class="sy0">.</span><span class="me1">Read</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; archive<span class="sy0">.</span><span class="me1">ExtractToDirectory</span><span class="br0">&#40;</span>destinationDirectoryName<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Using</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Catch</span> ex <span class="kw1">As</span> Exception
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ShowCriticalError<span class="br0">&#40;</span><span class="st0">&quot;Ошибка распаковки&quot;</span>, ex<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Try</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Sub</span>
<span class="kw1">End</span> <span class="kw1">Class</span></pre></td></tr></table></div></td></tr></tbody></table></div>На выходе у вас должен получиться вот такой проект. (архив с проектом прикреплён в вложения )<br />
<br />
в следующей части расскажу как подключить и настроить WebView2<br />
<br />
<br />
<a href="https://www.cyberforum.ru/blogs/1794766/10621.html">Часть 2</a></div>


<!-- attachments -->
	<div style="margin-top:10px">

		
		
		
		
			<fieldset class="fieldset">
				<legend>Вложения</legend>
				<table cellpadding="0" cellspacing="3" border="0">
				<tr>
	<td><img loading="lazy" decoding="async" class="inlineimg" src="http://www.cyberforum.ru//cyberstatic.net/images/attach/zip.gif" alt="Тип файла: zip" width="16" height="16" border="0" style="vertical-align:baseline" /></td>
	<td><a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=11275&amp;d=1760036982">DynamicWebView2Loader.zip</a> (724.1 Кб, 95 просмотров)</td>
</tr>
				</table>
			</fieldset>
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>edmonsur</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1794766/10620.html</guid>
		</item>
		<item>
			<title>Оживить vb.net при помощи WebView2 элемента</title>
			<link>https://www.cyberforum.ru/blogs/1794766/8641.html</link>
			<pubDate>Wed, 14 Aug 2024 05:52:22 GMT</pubDate>
			<description>WebView2 это на мой взгляд самый продвинутый, универсальный элемент  во всей визуальной студии,...</description>
			<content:encoded><![CDATA[<div>WebView2 это на мой взгляд самый продвинутый, универсальный элемент  во всей визуальной студии, который может почти всё.  <br />
Тут сразу нужно отметить что для  его использования в своих проектах по мимо знаний vb.net потребуются знания html, css и javascrpt. Так же нужно уметь правильно его инициализировать и настроить. <br />
<br />
Как я написал выше WebView2 универсальный элемент и подойдет как для показа html документов из интернета так и локальных  и даже написанных на лету и добавит вашему проекту больше возможностей, а возможностей у любого браузера как известно нимало. <br />
<br />
 <br />
1. Создайте новое Приложение Windows Forms (Майкрософт) Название проекта придумайте сами, укажите платформу ...я использую .Net 8.0<br />
<br />
2. В верхнем меню нажмите на Проект и выберите  вкладку Управление пакетами NuGet...<br />
<br />
3. В открывшемся  окне забейте в  окно поиска пакетов Microsoft.Web.WebView2, после того как пакет будет найден нажмите на него и добавьте его в свой проект. Как только пакет будет добавлен, можете смело закрыть это окно, сюда мы больше не вернёмся. <br />
<br />
4. Откройте панель элементов и добавите на окно WebView2 элемент (его размеры на данном этапе роли никакой не играют)<br />
<br />
5. Перейдите к коду окна и отредактируйте событие Form1_Load так<br />
<br />
<div class="codeblock"><table class="vbnet"><thead><tr><td colspan="2" id="640094085"  class="head">VB.NET</td></tr></thead><tbody><tr class="li1"><td><div id="640094085" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; <span class="kw1">Private</span> Async <span class="kw1">Sub</span> Form1_Load<span class="br0">&#40;</span>sender <span class="kw1">As</span> <span class="kw2">Object</span>, e <span class="kw1">As</span> EventArgs<span class="br0">&#41;</span> <span class="kw1">Handles</span> <span class="kw1">MyBase</span><span class="sy0">.</span><span class="me1">Load</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div>6. созидайте поле App и присвойте ему значение = My.Application.Info.ProductName<br />
<br />
код в вашем окне на данном этапе должен выглядеть так (думаю не трудно догадаться что делает Function Initialization() поэтому не стану описывать)<br />
<br />
<div class="codeblock"><table class="vbnet"><thead><tr><td colspan="2" id="617225344"  class="head">VB.NET</td></tr></thead><tbody><tr class="li1"><td><div id="617225344" style="height: 238px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="de1"><pre class="de1"><span class="kw1">Imports</span> Microsoft<span class="sy0">.</span><span class="me1">Web</span><span class="sy0">.</span><span class="me1">WebView2</span><span class="sy0">.</span><span class="me1">Core</span>
<span class="kw1">Imports</span> System<span class="sy0">.</span><span class="me1">IO</span>
&nbsp;
<span class="kw1">Public</span> <span class="kw1">Class</span> Form1
&nbsp; &nbsp; <span class="kw1">Public</span> <span class="kw1">ReadOnly</span> App <span class="sy0">=</span> My<span class="sy0">.</span><span class="me1">Application</span><span class="sy0">.</span><span class="me1">Info</span><span class="sy0">.</span><span class="me1">ProductName</span>
&nbsp; &nbsp; <span class="kw1">Private</span> Async <span class="kw1">Sub</span> Form1_Load<span class="br0">&#40;</span>sender <span class="kw1">As</span> <span class="kw2">Object</span>, e <span class="kw1">As</span> EventArgs<span class="br0">&#41;</span> <span class="kw1">Handles</span> <span class="kw1">MyBase</span><span class="sy0">.</span><span class="me1">Load</span>
&nbsp; &nbsp; &nbsp; &nbsp; Await Initialization<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Sub</span>
&nbsp; &nbsp; <span class="kw1">Private</span> Async <span class="kw1">Function</span> Initialization<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">As</span> Task
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> e <span class="sy0">=</span> Await CoreWebView2Environment<span class="sy0">.</span><span class="me1">CreateAsync</span><span class="br0">&#40;</span><span class="kw1">Nothing</span>, Path<span class="sy0">.</span><span class="me1">Combine</span><span class="br0">&#40;</span>Path<span class="sy0">.</span><span class="me1">GetTempPath</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, App<span class="br0">&#41;</span>, <span class="kw1">Nothing</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; Await WebView21<span class="sy0">.</span><span class="me1">EnsureCoreWebView2Async</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Function</span>
<span class="kw1">End</span> <span class="kw1">Class</span></pre></td></tr></table></div></td></tr></tbody></table></div>7. Теперь приступим к настройке WebView2 элемента. Что бы не выскочила ошибка нам нужно  дождаться завершения процесса инициализации. Отловить это событие можно так...<br />
<br />
<div class="codeblock"><table class="vbnet"><thead><tr><td colspan="2" id="474191109"  class="head">VB.NET</td></tr></thead><tbody><tr class="li1"><td><div id="474191109" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; <span class="kw1">Private</span> <span class="kw1">Sub</span> WebView21_CoreWebView2InitializationCompleted<span class="br0">&#40;</span>sender <span class="kw1">As</span> <span class="kw2">Object</span>, e <span class="kw1">As</span> CoreWebView2InitializationCompletedEventArgs<span class="br0">&#41;</span> <span class="kw1">Handles</span> WebView21<span class="sy0">.</span><span class="me1">CoreWebView2InitializationCompleted</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div>8. В верхнем меню Проект выберите пункт Создать папку и назовите её source. Папка должна появиться в Обозревателе решений. Наведите на эту папку курсор и нажмите правую кнопку мыши. В открытом меню выберите добавить и существующий элемент. Выберете любой mp3 файл ...на ваше усмотрение. После того как файл был добавлен. Выберите курсором этот файл и  его свойствах ..копировать в выходной каталог выбираете копировать более позднею версию.<br />
<br />
'Теперь мы готовы к первому старту. Код выглядит так<br />
<br />
<div class="codeblock"><table class="vbnet"><thead><tr><td colspan="2" id="331342581"  class="head">VB.NET</td></tr></thead><tbody><tr class="li1"><td><div id="331342581" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="de1"><pre class="de1"><span class="kw1">Imports</span> Microsoft<span class="sy0">.</span><span class="me1">Web</span><span class="sy0">.</span><span class="me1">WebView2</span><span class="sy0">.</span><span class="me1">Core</span>
<span class="kw1">Imports</span> System<span class="sy0">.</span><span class="me1">IO</span>
&nbsp;
<span class="kw1">Public</span> <span class="kw1">Class</span> Form1
&nbsp; &nbsp; <span class="kw1">Public</span> <span class="kw1">ReadOnly</span> App <span class="sy0">=</span> My<span class="sy0">.</span><span class="me1">Application</span><span class="sy0">.</span><span class="me1">Info</span><span class="sy0">.</span><span class="me1">ProductName</span>
&nbsp; &nbsp; <span class="kw1">Private</span> Async <span class="kw1">Sub</span> Form1_Load<span class="br0">&#40;</span>sender <span class="kw1">As</span> <span class="kw2">Object</span>, e <span class="kw1">As</span> EventArgs<span class="br0">&#41;</span> <span class="kw1">Handles</span> <span class="kw1">MyBase</span><span class="sy0">.</span><span class="me1">Load</span>
&nbsp; &nbsp; &nbsp; &nbsp; Await Initialization<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Sub</span>
&nbsp;
&nbsp;
&nbsp;
&nbsp; &nbsp; <span class="kw1">Private</span> Async <span class="kw1">Function</span> Initialization<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">As</span> Task
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> e <span class="sy0">=</span> Await CoreWebView2Environment<span class="sy0">.</span><span class="me1">CreateAsync</span><span class="br0">&#40;</span><span class="kw1">Nothing</span>, Path<span class="sy0">.</span><span class="me1">Combine</span><span class="br0">&#40;</span>Path<span class="sy0">.</span><span class="me1">GetTempPath</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, App<span class="br0">&#41;</span>, <span class="kw1">Nothing</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; Await WebView21<span class="sy0">.</span><span class="me1">EnsureCoreWebView2Async</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Function</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">Private</span> <span class="kw1">Sub</span> WebView21_CoreWebView2InitializationCompleted<span class="br0">&#40;</span>sender <span class="kw1">As</span> <span class="kw2">Object</span>, e <span class="kw1">As</span> CoreWebView2InitializationCompletedEventArgs<span class="br0">&#41;</span> <span class="kw1">Handles</span> WebView21<span class="sy0">.</span><span class="me1">CoreWebView2InitializationCompleted</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">If</span> e<span class="sy0">.</span><span class="me1">IsSuccess</span> <span class="kw1">Then</span>
<span class="co1">'тут первая настройка &nbsp;создаём &nbsp;виртуальный хост &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>
sender<span class="sy0">.</span><span class="me1">CoreWebView2</span><span class="sy0">.</span><span class="me1">SetVirtualHostNameToFolderMapping</span><span class="br0">&#40;</span>App, <span class="st0">&quot;source&quot;</span>, CoreWebView2HostResourceAccessKind<span class="sy0">.</span><span class="me1">Allow</span><span class="br0">&#41;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sender<span class="sy0">.</span><span class="me1">NavigateToString</span><span class="br0">&#40;</span><span class="st0">&quot;&lt;h3&gt;Привет лунатикам&lt;/h3&gt;&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">If</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Sub</span>
<span class="kw1">End</span> <span class="kw1">Class</span></pre></td></tr></table></div></td></tr></tbody></table></div>Позже расскажу как отключить контекстное меню у  WebView2 элемента, зачем нужен виртуальный хост, как отловить разные события элемента и как заcтавить WebView2 играть музыку.<br />
<br />
<br />
<br />
<br />
Ну Вот и настало позже... Если вы сделали все правильно, То при первом старте программы вы должны увидеть в окне WebView2 элемента Привет лунатикам... и мы продолжаем <br />
<br />
Откройте любой текстовый редактор, скопируйте туда ниже приведенный код и сохраните документ к примеру как document.htm и добавите его в ресурсы программы.  Он должен быть доступен вот по этому адресу  My.Resources.document<br />
<br />
<div class="codeblock"><table class="html5"><thead><tr><td colspan="2" id="836101964"  class="head">HTML5</td></tr></thead><tbody><tr class="li1"><td><div id="836101964" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
</pre></td><td class="de1"><pre class="de1"><span class="sc0">&lt;!DOCTYPE html&gt;</span>
<span class="sc2">&lt;<span class="kw2">html</span> <span class="kw3">lang</span><span class="sy0">=</span><span class="st0">&quot;en&quot;</span>&gt;</span>
<span class="sc2">&lt;<span class="kw2">head</span>&gt;</span>
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">meta</span> <span class="kw3">charset</span><span class="sy0">=</span><span class="st0">&quot;UTF-8&quot;</span>&gt;</span>
&nbsp;
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">head</span>&gt;</span>
&nbsp;
<span class="sc2">&lt;<span class="kw2">body</span>&gt;</span>
&nbsp;
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">h3</span>&gt;</span>Привет лунатикам<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">h3</span>&gt;</span>
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">audio</span> controls <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;myAudio&quot;</span> preload<span class="sy0">=</span><span class="st0">&quot;auto&quot;</span> loop<span class="sy0">=</span><span class="st0">&quot;loop&quot;</span> hidden&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">source</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;##VirtualHost##salyut.mp3&quot;</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;audio/mpeg&quot;</span>&gt;</span>
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">audio</span>&gt;</span>
&nbsp;
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">script</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span>&gt;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; document.addEventListener('keydown', key_down);
&nbsp; &nbsp; &nbsp; &nbsp; document.addEventListener('mousedown', mouse_down);
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; function key_down() {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; document.removeEventListener('keydown', key_down);
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; window.chrome.webview.postMessage(&quot;keydown&quot;);
&nbsp; &nbsp; &nbsp; &nbsp; }
&nbsp; &nbsp; &nbsp; &nbsp; function mouse_down() {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; document.removeEventListener('mousedown', mouse_down);
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; window.chrome.webview.postMessage(&quot;mousedown&quot;);
&nbsp; &nbsp; &nbsp; &nbsp; }
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; function AutoRun() {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; document.getElementById('myAudio').play();
&nbsp; &nbsp; &nbsp; &nbsp; }
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">script</span>&gt;</span>
&nbsp;
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">body</span>&gt;</span>
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">html</span>&gt;</span></pre></td></tr></table></div></td></tr></tbody></table></div>VB имеет возможность запускать функции javascript(a), тут есть правда один нюанс... что бы всё работало как нужно...нужно дождаться полной загрузки html документа в WebView2 элемент<br />
<br />
поймать это событие и запустить функцию можно вот так <br />
<br />
<div class="codeblock"><table class="vbnet"><thead><tr><td colspan="2" id="673945535"  class="head">VB.NET</td></tr></thead><tbody><tr class="li1"><td><div id="673945535" style="height: 110px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; <span class="kw1">Private</span> <span class="kw1">Sub</span> WebView21_NavigationCompleted<span class="br0">&#40;</span>sender <span class="kw1">As</span> <span class="kw2">Object</span>, e <span class="kw1">As</span> CoreWebView2NavigationCompletedEventArgs<span class="br0">&#41;</span> <span class="kw1">Handles</span> WebView21<span class="sy0">.</span><span class="me1">NavigationCompleted</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">If</span> e<span class="sy0">.</span><span class="me1">IsSuccess</span> <span class="kw1">Then</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sender<span class="sy0">.</span><span class="me1">ExecuteScriptAsync</span><span class="br0">&#40;</span><span class="st0">&quot;AutoRun()&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">If</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div>Зачем был нужен виртуальный хост?<br />
<br />
Поскольку нашего html документа как бы не существует и его местоположение неизвестно, короткие ссылки на ресурсы из html  типа такой <div class="codeblock"><table class="html5"><thead><tr><td colspan="2" id="512367272"  class="head">HTML5</td></tr></thead><tbody><tr class="li1"><td><div id="512367272" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1"><span class="sc2">&lt;<span class="kw2">source</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;./salyut.mp3&quot;</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;audio/mpeg&quot;</span>&gt;</span></pre></td></tr></table></div></td></tr></tbody></table></div> работать не будут <br />
Все ресурсы в папке source будут доступны по адресу  &quot;https://WinFormsApp1/&quot; или ровны значению поля VirtualHost<br />
<br />
 <div class="codeblock"><table class="html5"><thead><tr><td colspan="2" id="587335785"  class="head">HTML5</td></tr></thead><tbody><tr class="li1"><td><div id="587335785" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1"><span class="sc2">&lt;<span class="kw2">source</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;https://WinFormsApp1/salyut.mp3&quot;</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;audio/mpeg&quot;</span>&gt;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Как поймать события внутри WebView2 элемента?<br />
<br />
Тут тоже всё очень просто... при помощи javascript(a) и перенаправить в VB через postMessage<br />
<br />
Поймать в VB  и обработать можно таким образом...<br />
<br />
<div class="codeblock"><table class="vbnet"><thead><tr><td colspan="2" id="940330660"  class="head">VB.NET</td></tr></thead><tbody><tr class="li1"><td><div id="940330660" style="height: 190px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; <span class="kw1">Private</span> <span class="kw1">Sub</span> WebView21_WebMessageReceived<span class="br0">&#40;</span>sender <span class="kw1">As</span> <span class="kw2">Object</span>, e <span class="kw1">As</span> CoreWebView2WebMessageReceivedEventArgs<span class="br0">&#41;</span> <span class="kw1">Handles</span> WebView21<span class="sy0">.</span><span class="me1">WebMessageReceived</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> js <span class="sy0">=</span> e<span class="sy0">.</span><span class="me1">TryGetWebMessageAsString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Select</span> <span class="kw1">Case</span> <span class="kw1">True</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Case</span> js <span class="sy0">=</span> <span class="st0">&quot;mousedown&quot;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw7">MsgBox</span><span class="br0">&#40;</span><span class="st0">&quot;Была нажата кнопка мыши&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Case</span> js <span class="sy0">=</span> <span class="st0">&quot;keydown&quot;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw7">MsgBox</span><span class="br0">&#40;</span><span class="st0">&quot;Была нажата клавиша клавиатуры&quot;</span><span class="br0">&#41;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Select</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div><br />
а это весь код <br />
<br />
<div class="codeblock"><table class="vbnet"><thead><tr><td colspan="2" id="631662561"  class="head">VB.NET</td></tr></thead><tbody><tr class="li1"><td><div id="631662561" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
</pre></td><td class="de1"><pre class="de1"><span class="kw1">Imports</span> Microsoft<span class="sy0">.</span><span class="me1">Web</span><span class="sy0">.</span><span class="me1">WebView2</span><span class="sy0">.</span><span class="me1">Core</span>
<span class="kw1">Imports</span> System<span class="sy0">.</span><span class="me1">IO</span>
&nbsp;
<span class="kw1">Public</span> <span class="kw1">Class</span> Form1
&nbsp; &nbsp;<span class="kw1">Public</span> &nbsp;<span class="kw1">ReadOnly</span> App <span class="sy0">=</span> My<span class="sy0">.</span><span class="me1">Application</span><span class="sy0">.</span><span class="me1">Info</span><span class="sy0">.</span><span class="me1">ProductName</span><span class="sy0">.</span><span class="me1">ToLower</span>
&nbsp; &nbsp; <span class="kw1">Public</span> &nbsp;<span class="kw1">ReadOnly</span> VirtualHost <span class="kw1">As</span> <span class="kw2">String</span> <span class="sy0">=</span> <span class="st0">&quot;https://&quot;</span> <span class="sy0">+</span> App <span class="sy0">+</span> <span class="st0">&quot;/&quot;</span>
&nbsp; &nbsp; <span class="kw1">Private</span> Async <span class="kw1">Sub</span> Form1_Load<span class="br0">&#40;</span>sender <span class="kw1">As</span> <span class="kw2">Object</span>, e <span class="kw1">As</span> EventArgs<span class="br0">&#41;</span> <span class="kw1">Handles</span> <span class="kw1">MyBase</span><span class="sy0">.</span><span class="me1">Load</span>
&nbsp; &nbsp; &nbsp; &nbsp; WebView21<span class="sy0">.</span><span class="me1">Bounds</span> <span class="sy0">=</span> DisplayRectangle
&nbsp; &nbsp; &nbsp; &nbsp; Await Initialization<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Sub</span>
&nbsp;
&nbsp;
&nbsp;
&nbsp; &nbsp; <span class="kw1">Private</span> Async <span class="kw1">Function</span> Initialization<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">As</span> Task
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> e <span class="sy0">=</span> Await CoreWebView2Environment<span class="sy0">.</span><span class="me1">CreateAsync</span><span class="br0">&#40;</span><span class="kw1">Nothing</span>, Path<span class="sy0">.</span><span class="me1">Combine</span><span class="br0">&#40;</span>Path<span class="sy0">.</span><span class="me1">GetTempPath</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, App<span class="br0">&#41;</span>, <span class="kw1">Nothing</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; Await WebView21<span class="sy0">.</span><span class="me1">EnsureCoreWebView2Async</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Function</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">Private</span> <span class="kw1">Sub</span> WebView21_CoreWebView2InitializationCompleted<span class="br0">&#40;</span>sender <span class="kw1">As</span> <span class="kw2">Object</span>, e <span class="kw1">As</span> CoreWebView2InitializationCompletedEventArgs<span class="br0">&#41;</span> <span class="kw1">Handles</span> WebView21<span class="sy0">.</span><span class="me1">CoreWebView2InitializationCompleted</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">If</span> e<span class="sy0">.</span><span class="me1">IsSuccess</span> <span class="kw1">Then</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sender<span class="sy0">.</span><span class="me1">CoreWebView2</span><span class="sy0">.</span><span class="me1">SetVirtualHostNameToFolderMapping</span><span class="br0">&#40;</span>App, <span class="st0">&quot;source&quot;</span>, CoreWebView2HostResourceAccessKind<span class="sy0">.</span><span class="me1">Allow</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sender<span class="sy0">.</span><span class="me1">CoreWebView2</span><span class="sy0">.</span><span class="me1">Settings</span><span class="sy0">.</span><span class="me1">AreBrowserAcceleratorKeysEnabled</span> <span class="sy0">=</span> <span class="kw1">False</span> <span class="co1">' отключаем горячие клавиши</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sender<span class="sy0">.</span><span class="me1">CoreWebView2</span><span class="sy0">.</span><span class="me1">Settings</span><span class="sy0">.</span><span class="me1">AreDefaultContextMenusEnabled</span> <span class="sy0">=</span> <span class="kw1">False</span> <span class="co1">' отключаем Контекст Меню</span>
&nbsp;
&nbsp;
&nbsp;
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sender<span class="sy0">.</span><span class="me1">NavigateToString</span><span class="br0">&#40;</span>My<span class="sy0">.</span><span class="me1">Resources</span><span class="sy0">.</span><span class="me1">document</span><span class="sy0">.</span><span class="kw7">Replace</span><span class="br0">&#40;</span><span class="st0">&quot;##VirtualHost##&quot;</span>, VirtualHost<span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">If</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Sub</span>
&nbsp; &nbsp; <span class="kw1">Private</span> <span class="kw1">Sub</span> WebView21_NavigationCompleted<span class="br0">&#40;</span>sender <span class="kw1">As</span> <span class="kw2">Object</span>, e <span class="kw1">As</span> CoreWebView2NavigationCompletedEventArgs<span class="br0">&#41;</span> <span class="kw1">Handles</span> WebView21<span class="sy0">.</span><span class="me1">NavigationCompleted</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">If</span> e<span class="sy0">.</span><span class="me1">IsSuccess</span> <span class="kw1">Then</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sender<span class="sy0">.</span><span class="me1">ExecuteScriptAsync</span><span class="br0">&#40;</span><span class="st0">&quot;AutoRun()&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">If</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Sub</span>
&nbsp;
&nbsp;
&nbsp;
&nbsp; &nbsp; <span class="kw1">Private</span> <span class="kw1">Sub</span> WebView21_WebMessageReceived<span class="br0">&#40;</span>sender <span class="kw1">As</span> <span class="kw2">Object</span>, e <span class="kw1">As</span> CoreWebView2WebMessageReceivedEventArgs<span class="br0">&#41;</span> <span class="kw1">Handles</span> WebView21<span class="sy0">.</span><span class="me1">WebMessageReceived</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Dim</span> js <span class="sy0">=</span> e<span class="sy0">.</span><span class="me1">TryGetWebMessageAsString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Select</span> <span class="kw1">Case</span> <span class="kw1">True</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Case</span> js <span class="sy0">=</span> <span class="st0">&quot;mousedown&quot;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw7">MsgBox</span><span class="br0">&#40;</span><span class="st0">&quot;Была нажата кнопка мыши&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Case</span> js <span class="sy0">=</span> <span class="st0">&quot;keydown&quot;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw7">MsgBox</span><span class="br0">&#40;</span><span class="st0">&quot;Была нажата клавиша клавиатуры&quot;</span><span class="br0">&#41;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Select</span>
&nbsp; &nbsp; <span class="kw1">End</span> <span class="kw1">Sub</span>
<span class="kw1">End</span> <span class="kw1">Class</span></pre></td></tr></table></div></td></tr></tbody></table></div>всё !!!</div>


<!-- attachments -->
	<div style="margin-top:10px">

		
			<fieldset class="fieldset">
				<legend>Миниатюры</legend>
				<div style="padding:3px">
				
	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=8931&amp;d=1723604280" target="attachment" rel="Lightbox" id="attachment8931"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=8931&amp;stc=1&amp;thumb=1&amp;d=1723604280" border="0" alt="Нажмите на изображение для увеличения
Название: #1.jpg
Просмотров: 8658
Размер:	167.2 Кб
ID:	8931" /></a>
	&nbsp;
	

	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=8932&amp;d=1723604962" target="attachment" rel="Lightbox" id="attachment8932"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=8932&amp;stc=1&amp;thumb=1&amp;d=1723604962" border="0" alt="Нажмите на изображение для увеличения
Название: #2.jpg
Просмотров: 7513
Размер:	165.5 Кб
ID:	8932" /></a>
	&nbsp;
	

	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=8934&amp;d=1723610936" target="attachment" rel="Lightbox" id="attachment8934"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=8934&amp;stc=1&amp;thumb=1&amp;d=1723610936" border="0" alt="Нажмите на изображение для увеличения
Название: #3.jpg
Просмотров: 7320
Размер:	81.6 Кб
ID:	8934" /></a>
	&nbsp;
	
		<br /><br />
	

	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=8935&amp;d=1723610983" target="attachment" rel="Lightbox" id="attachment8935"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=8935&amp;stc=1&amp;thumb=1&amp;d=1723610983" border="0" alt="Нажмите на изображение для увеличения
Название: #4.jpg
Просмотров: 8081
Размер:	165.2 Кб
ID:	8935" /></a>
	&nbsp;
	

	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=8936&amp;d=1723614124" target="attachment" rel="Lightbox" id="attachment8936"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=8936&amp;stc=1&amp;thumb=1&amp;d=1723614124" border="0" alt="Нажмите на изображение для увеличения
Название: #5.jpg
Просмотров: 7556
Размер:	95.1 Кб
ID:	8936" /></a>
	&nbsp;
	

				</div>
			</fieldset>
		
		
		
		
			<fieldset class="fieldset">
				<legend>Вложения</legend>
				<table cellpadding="0" cellspacing="3" border="0">
				
				</table>
			</fieldset>
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>edmonsur</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1794766/8641.html</guid>
		</item>
		<item>
			<title>Установка Linux программ на Google ChromeOS Flex</title>
			<link>https://www.cyberforum.ru/blogs/1794766/8485.html</link>
			<pubDate>Thu, 28 Mar 2024 21:33:35 GMT</pubDate>
			<description>!!!  заранее убедитесь что  в BIOS Virtualization Technology включена  enabled !!!  
 
Заходим в...</description>
			<content:encoded><![CDATA[<div>!!!  заранее убедитесь что  в BIOS Virtualization Technology включена  enabled !!! <br />
<br />
Заходим в &quot;Настройки&quot; , &quot;Дополнительные&quot; , &quot;Для разработчиков&quot; , установлением Среду разработки Linux<br />
<br />
<br />
закрываем настройки и открываем панель запуска,  там находим  &quot;Приложения для Linux&quot; , открываем консоль Vim<br />
и можем приступать к установке программ. <br />
<br />
к примеру медиаплеер VLC  <br />
<br />
sudo apt install vlc</div>

]]></content:encoded>
			<dc:creator>edmonsur</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1794766/8485.html</guid>
		</item>
		<item>
			<title>Как программировать на Google ChromeOS Flex?</title>
			<link>https://www.cyberforum.ru/blogs/1794766/8484.html</link>
			<pubDate>Thu, 28 Mar 2024 15:27:11 GMT</pubDate>
			<description>Программировать на Google ChromeOS Flex можно двумя способами. Первый это установка среды...</description>
			<content:encoded><![CDATA[<div>Программировать на Google ChromeOS Flex можно двумя способами. Первый это установка среды разработки Linux .. и второй это программирование расширений для Google Chrome. Которые работают как и в самом бравзере так и в ChromeOS Flex глобально. <br />
<br />
Для написания расширений потребуется активировать  в Google Chrome  режим разработчика.  Просто забиваем в адресную строку chrome://extensions/ нажимаем enter ... в правом верхнем углу активируем режим разработчика.<br />
<br />
Дальше HTML, CSS и  Javascript в помощь</div>

]]></content:encoded>
			<dc:creator>edmonsur</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1794766/8484.html</guid>
		</item>
		<item>
			<title>Пошаговая инструкция по установке Google ChromeOS Flex</title>
			<link>https://www.cyberforum.ru/blogs/1794766/8483.html</link>
			<pubDate>Thu, 28 Mar 2024 14:21:30 GMT</pubDate>
			<description>Прежде всего для установки Google ChromeOS Flex  потребуется usb накопитель размером не меньше 8...</description>
			<content:encoded><![CDATA[<div>Прежде всего для установки Google ChromeOS Flex  потребуется usb накопитель размером не меньше 8 гигабайт.<br />
<br />
Если на вашем компьютере не установлен Google Chrome браузер...то устанавливаем его. Это нужно для создания установочного  <br />
usb носителя.<br />
<br />
1.Создания установочного usb носителя.<br />
переходим по ссылке и устанавливаем расширение  <a rel="nofollow noopener noreferrer" href="https://chromewebstore.google.com/detail/%D1%83%D1%82%D0%B8%D0%BB%D0%B8%D1%82%D0%B0-%D0%B2%D0%BE%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F-ch/pocpnlppkickgojjlmhdmidojbmbodfm?hl=ru" target="_blank" title="https://chromewebstore.google.com/detail/%D1%83%D1%82%D0%B8%D0%BB%D0%B8%D1%82%D0%B0-%D0%B2%D0%BE%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F-ch/pocpnlppkickgojjlmhdmidojbmbodfm?hl=ru">Утилита восстановления Chromebook</a> <br />
<br />
После того как утилита будет установлена.  в правом верхнем углу браузера нажимаем на иконку Утилиты восстановления.<br />
<br />
Вставляем usb носитель в свободный разьём. В открывшемся окне Утилиты восстановления.. нажимаем на кнопку  &quot;начать&quot;<br />
<br />
в следующем на &quot;Выберите модель из списка&quot; <br />
<br />
далее на &quot;выберите производителя&quot; ... в открывшемся списке выбираем Google ChromeOS Flex ...<br />
<br />
ниже... нажимаем на &quot;выберите продукт&quot; тут...так же выбираем Google ChromeOS Flex и жмём на кнопку &quot;Продолжить&quot;<br />
<br />
Дальше читаем и соглашаемся. Ну в общем то и всё!!! Ждём пока носитель будет записан.</div>


<!-- attachments -->
	<div style="margin-top:10px">

		
		
		
		
			<fieldset class="fieldset">
				<legend>Вложения</legend>
				<table cellpadding="0" cellspacing="3" border="0">
				<tr>
	<td><img loading="lazy" decoding="async" class="inlineimg" src="http://www.cyberforum.ru//cyberstatic.net/images/attach/webm.gif" alt="Тип файла: webm" width="16" height="16" border="0" style="vertical-align:baseline" /></td>
	<td><a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=8584&amp;d=1711636531">Screen recording 2024-03-28 15.32.55.webm</a> (2.15 Мб, 326 просмотров)</td>
</tr>
				</table>
			</fieldset>
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>edmonsur</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1794766/8483.html</guid>
		</item>
		<item>
			<title>Google ChromeOS Flex</title>
			<link>https://www.cyberforum.ru/blogs/1794766/8482.html</link>
			<pubDate>Thu, 28 Mar 2024 13:22:08 GMT</pubDate>
			<description>Сегодня пересел на Google ChromeOS Flex.  
Устанвка системы прошла давольно легко. 
...</description>
			<content:encoded><![CDATA[<div>Сегодня пересел на Google ChromeOS Flex. <br />
Устанвка системы прошла давольно легко.<br />
<br />
Ощужения...Для кастрированного Линукс очень даже не плохо.</div>


<!-- attachments -->
	<div style="margin-top:10px">

		
		
		
			<fieldset class="fieldset">
				<legend>Изображения</legend>
				<table cellpadding="0" cellspacing="3" border="0">
				<tr>
	<td><img loading="lazy" decoding="async" class="inlineimg" src="http://www.cyberforum.ru//cyberstatic.net/images/attach/jpg.gif" alt="Тип файла: jpg" width="16" height="16" border="0" style="vertical-align:baseline" /></td>
	<td><a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=8583&amp;d=1711632049">Screenshot 2024-03-28 14.18.32.jpg</a> (103.2 Кб, 210 просмотров)</td>
</tr>
				</table>
				</fieldset>
		
		
			<fieldset class="fieldset">
				<legend>Вложения</legend>
				<table cellpadding="0" cellspacing="3" border="0">
				
				</table>
			</fieldset>
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>edmonsur</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1794766/8482.html</guid>
		</item>
	</channel>
</rss>
