我正在尝试将 WebView2 DLL 嵌入到 C# 项目中。我添加了 3 个 DLL:
Microsoft.Web.WebView2.Wpf.dll
Microsoft.Web.WebView2.Core.dll
WebView2Loader.dll
Run Code Online (Sandbox Code Playgroud)
作为我的项目的嵌入式资源。由于它是一个 WPF 项目,我不需要 Microsoft.Web.WebView2.Forms.dll。
我已经正确合并了 Newtonsoft.Json.dll。
在调试模式下,没有问题,因为所有DLL都被复制到输出目录。
因为我希望可执行文件是可移植的,所以我只需要一个文件(我知道用 exe 复制 DLL 是可行的,但我需要一个文件)。当我仅将主可执行文件移动到另一个文件夹时,当我使用 webview2 控件时应用程序崩溃(该控件在启动时未加载)。
我试图弄清楚是否所有的 DLL 都参与其中。Microsoft.Web.WebView2.Wpf.dll 已正确嵌入,我不需要在目标文件夹中使用它。
然而,最后两个仍然是必需的。我认为这可能是因为它们是由 Microsoft.Web.WebView2.Wpf.dll 调用的,而不是由主程序集调用的。
如何从主程序集中加载最后两个文件以获得单个执行文件?
编辑:所有 DLL 都作为嵌入式资源添加到项目中
感谢@mm8给我部分想法(欢迎任何完整解决方案的建议)实现这一目标。
因此,可以通过添加 3 个 WebView2 DLL 并将它们设置为嵌入资源来将它们嵌入到您的项目中。Microsoft.Web.WebView2.Wpf.dll(或者Microsoft.Web.WebView2.WinForms.dll,取决于您的选择)可以直接加载到内存中。但最后两个(Microsoft.Web.WebView2.Core.dll和WebView2Loader.dll)需要保存为文件:
public MainWindow()
{
// For Newtonsoft.Json.dll, Microsoft.Web.WebView2.Wpf.dll, Microsoft.Web.WebView2.Core.dll and WebView2Loader.dll
// Incorporation as embedded resource
// To avoid having multiple files, only one executable
AppDomain.CurrentDomain.AssemblyResolve += GetEmbeddedDll; …Run Code Online (Sandbox Code Playgroud)