我们有一个类库(可由不受我们控制的第三方应用程序使用,并部署为带有嵌入式引用的单个文件dll),该类库以前使用 WebBrowser 控件。这是一个非常简单,易于使用和部署的控制,现在是过去的黄金时期。但是尝试用 * WebView 2 * 替换它是相当困难的。现在,我们已经让它工作了,但是我们不能让运行时包含在部署的dll中。(我们本来可以使用 WebView 控件,但奇怪的是,在Admin权限下运行时会出现问题。
该库是.NET 4.6.2(为了尽可能多地向后兼容.NET Framework)。我们使用Fody Weavers来包含 RestSharp、NLog 等,现在已经添加了 Microsoft.Web.WebView2.Core、Microsoft.Web.WebView2.WinForms 和 Microsoft.Web.WebView2.Wpf。
我们还有 Costura 指令UseRuntimeReferencePaths='true'
,我相信这是.NET Framework项目所必需的。
但是当我运行应用程序测试表单时-它消耗了库-我得到了一个路径错误:
The path is not of a legal form.
at System.IO.Path.NormalizePath(String path, Boolean fullCheck, Int32 maxPathLength, Boolean expandShortPaths)
at System.IO.Path.InternalGetDirectoryName(String path)
at Microsoft.Web.WebView2.Core.CoreWebView2Environment.LoadWebView2LoaderDll()
at Microsoft.Web.WebView2.Core.CoreWebView2Environment.<CreateAsync>d__3.MoveNext()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
at Microsoft.Web.WebView2.WinForms.WebView2.<InitCoreWebView2Async>d__23.MoveNext()
我已经尝试了一些方法来确保运行时被包括在内,比如将它们作为资源嵌入,但都无济于事。
如果我们不能达成协议,我们就完了;我们必须有一个单一的文件库/dll中包含的一切。我的问题是,有人做到了吗?(祈祷答案是:“当然!就这么做……”)。
2条答案
按热度按时间gjmwrych1#
WebView2
使用Win32函数LoadLibrary
加载的本机代码。据我所知,本机DLL必须在文件系统上。无法从资源加载它。由于托管代码试图生成本机代码DLL的路径,因此引发异常:
我能看到的唯一可行的解决方法是将所需的DLL存储在资源中,将其写入临时文件夹,并将
CoreWebView2Environment.LoaderDllFolderPath
设置为该文件夹。这将绕过上面的路径构建逻辑。xqk2d5yq2#
WebView2Loader、Microsoft.Web.WebView2.Core是非托管程序集。
您可以在项目中创建一个名为“Costura32”或“Costura64”的文件夹,并添加WebView2Loader.dll、Microsoft.Web.WebView2.Core.dll,并将“Build Action”设置为“Embedded Resource”。
然后,假设dll是32位的,将以下设置放入FodyWeavers.xml: