В CefSharp есть много зависимостей и библиотек, которые требуется запустить. Папки сборки загромождены. Как переместить необходимые .dll и .pak зависимости в подпапку?Как переместить зависимости и файлы CefSharp в подкаталог?
ответ
Прежде всего, чтобы все было проще, я бы рекомендовал добавить папку в Visual Studios и поместить туда все необходимые файлы. Если вы сделаете эту папку в проводнике, нажмите кнопку «показать все файлы» выше вашего решения в обозревателе решений:
Это правой кнопкой мыши папку (ы) и файл (ы), которые вы хотите включить и выбрать «включить в проект».
Не забудьте включить все необходимые CefSharp файлы - more info on github
Вы должны в конечном итоге с деревом файлов, который выглядит примерно так:
Обязательно измените «Копировать в выходной Directy» в «Копировать всегда» в свойствах для всех файлов.
Теперь код. У вашего решения должен быть файл «App.config» (если нет, google вокруг, и вы найдете способ его генерации).
Вы собираетесь добавить новый assemblyBinding
и probing
элемента к нему (MSDN - probing)
probing
элемента говорит окно он должен выглядеть в дополнительных папках для библиотек. Таким образом, мы можем загружать все необходимые DLL для CefSharp таким образом.
Пример 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 и т. Д. В выходной каталог, но вы можете проверить, успешна ли ваша сборка, удалив зависимости из вашей основной папки (оставив папку ресурсов).
Очень полезный учебник, спасибо. Однако вы пропустили определение «CefLibraryHandle», вы (любой, кто в нем нуждается) можете найти его здесь: https: // github.ком/cefsharp/CefSharp/BLOB/Master/CefSharp/CefLibraryHandle.cs – Jhollman