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

时间:2016-09-08 21:01:30

标签: cefsharp

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

1 个答案:

答案 0 :(得分:9)

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

enter image description here

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

请务必包含所有必需的CefSharp文件 - more info on github
您最终应该得到一个与此类似的文件树:

enter image description here

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

enter image description here

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

您要向其添加新的assemblyBindingprobing元素(MSDN - probing
probing元素告诉Windows它应该在库的其他文件夹中查找。因此,我们可以通过这种方式为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>

注意:路径是相对于.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());
}

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

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