如何将CefSharp依赖项和文件移动到子目录?

Xan*_*ano 3 cefsharp

CefSharp有很多依赖项和库需要运行.构建文件夹杂乱无章.如何将所需的.dll和.pak依赖项移动到子文件夹?

Xan*_*ano 9

首先,为了使一切更容易,我建议在Visual Studios中添加一个文件夹,并将所有必需的文件放在那里.如果您在资源管理器中创建此文件夹,请在解决方案资源管理器中单击解决方案上方的"显示所有文件":

在此输入图像描述

右键单击要包含的文件夹和文件,然后选择"包含在项目中".

确保包含所有必需的CefSharp文件 - 有关github的更多信息
您应该得到一个类似于以下内容的文件树:

在此输入图像描述

请务必在所有文件的属性下将"复制到输出Directy"更改为"始终复制".

在此输入图像描述

现在为代码.你的解决方案应该有一个'App.config'文件(如果没有,谷歌周围,你会找到生成一个的方法).

你要一个新的补充assemblyBindingprobing元素,它(MSDN -探测)
probing元素告诉它应该在其他文件夹图书馆的窗户.因此,我们可以通过这种方式加载CefSharp所需的所有.dll.

示例App.config:

<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="resources/cefsharp" />
    </assemblyBinding>
  </runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)

注意:路径是相对于.exe文件的位置.

现在需要处理.dll文件,但我们现在需要更改CefSharp的设置,以便它知道在哪里查找.pak文件,以及语言环境和BrowserSubprocess.exe.

为此,我们将定义所有文件路径并手动将它们分配给CefSharp.

这是一个它应该是什么样子的例子:

// File location variables
static string lib, browser, locales, res;

[STAThread]
static void Main()
{
    // Assigning file paths to varialbles
    lib = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"resources\cefsharp\libcef.dll");
    browser = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"resources\cefsharp\CefSharp.BrowserSubprocess.exe");
    locales = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"resources\cefsharp\locales\");
    res = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"resources\cefsharp\");

    var libraryLoader = new CefLibraryHandle(lib);
    bool isValid = !libraryLoader.IsInvalid;
    Console.WriteLine($"Library is valid: {isValid}");

    LoadForm();

    libraryLoader.Dispose();
}

[MethodImpl(MethodImplOptions.NoInlining)]
private static void LoadForm()
{
    var settings = new CefSettings();
    settings.BrowserSubprocessPath = browser;
    settings.LocalesDirPath = locales;
    settings.ResourcesDirPath = res;

    Cef.Initialize(settings, shutdownOnProcessExit: false, performDependencyCheck: false);

    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new CefWinForm());
}
Run Code Online (Sandbox Code Playgroud)

所有这些都改编自:https://github.com/cefsharp/CefSharp/issues/601
原始问题很难完全遵循并且正常工作所以我想我会分享知识以防万一遇到类似的麻烦未来.

注意:Visual Studio仍将在输出目录中包含.dll,.pak,.xml等,但您可以通过删除主文件夹中的依赖项(离开资源文件夹)来检查构建是否成功.