2016-09-08 6 views

ответ

5

Прежде всего, чтобы все было проще, я бы рекомендовал добавить папку в Visual Studios и поместить туда все необходимые файлы. Если вы сделаете эту папку в проводнике, нажмите кнопку «показать все файлы» выше вашего решения в обозревателе решений:

enter image description here

Это правой кнопкой мыши папку (ы) и файл (ы), которые вы хотите включить и выбрать «включить в проект».

Не забудьте включить все необходимые CefSharp файлы - more info on github
Вы должны в конечном итоге с деревом файлов, который выглядит примерно так:

enter image description here

Обязательно измените «Копировать в выходной Directy» в «Копировать всегда» в свойствах для всех файлов.

enter image description here

Теперь код. У вашего решения должен быть файл «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 и т. Д. В выходной каталог, но вы можете проверить, успешна ли ваша сборка, удалив зависимости из вашей основной папки (оставив папку ресурсов).

+1

Очень полезный учебник, спасибо. Однако вы пропустили определение «CefLibraryHandle», вы (любой, кто в нем нуждается) можете найти его здесь: https: // github.ком/cefsharp/CefSharp/BLOB/Master/CefSharp/CefLibraryHandle.cs – Jhollman

Смежные вопросы