日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

让 CefSharp.WinForms 应用程序同时支持32位(x86)和64位(x64)的解决方案

發(fā)布時間:2023/12/4 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 让 CefSharp.WinForms 应用程序同时支持32位(x86)和64位(x64)的解决方案 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

當我們?yōu)榛?.NET Framework 的 WinForm 程序增加 CefSharp.WinForms 依賴后,可能會遇到以下報錯信息:

CefSharp.Common is unable to proceeed as your current Platform is ‘AnyCPU’. To target AnyCPU please read https://github.com/cefsharp/CefSharp/issues/1714. Alternatively change your Platform to x86 or x64 and the relevant files will be copied automatically. For details on changing your projects Platform see https://docs.microsoft.com/en-gb/visualstudio/ide/how-to-configure-projects-to-target-platforms?view=vs-2017 CefSharpDemo

CefSharp.Common.targets

我們可以通過“配置管理器”為項目設置具體的 x86 或 x64 目標平臺來消除該報錯,同時我們也可以通過一些設置讓我們的程序同時支持 x86 和 x64 目標平臺。本篇將簡述如何為依賴來 CefSharp.WinForms 的程序啟用 AnyCPU 支持。英文版的操作步驟可參見:Feature Request – Add AnyCPU Support 。

為依賴 CefSharp 的程序增加 AnyCPU 支持

筆者新建了一個名為 CefSharpDemo 的 WinForm 項目,并通過 NuGet 引入 CefSharp.WinForms 組件:

首先,在項目上點擊右鍵,選擇“卸載項目”,在項目卸載成功后,再次點擊右鍵,選擇“編輯項目文件”。之后會看到以下類似的窗體:

在第一個?PropertyGroup?標簽里增加?<CefSharpAnyCpuSupport>true</CefSharpAnyCpuSupport>?代碼段:

修改完成之后,再次在項目文件上右擊,選擇“重新加載項目”。此番操作之后,項目的生成就不會報錯了,可以發(fā)現(xiàn)在 bin 目錄中多出了名為 x86 和 x64 的兩個文件夾,分別對應 32 位和 64 位的應用程序。接下來我們需要在程序中根據(jù)運行環(huán)境,動態(tài)選擇要加載的文件。

CefSharp 依賴文件的動態(tài)加載

我們可以通過?AppDomain.CurrentDomain.AssemblyResolve?事件將應用程序所需的組件注冊進來。以下代碼實現(xiàn)了該功能,并且根據(jù)是否 64 位進程選擇具體加載哪個目錄中的程序集:

using CefSharp;using CefSharp.WinForms;using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Reflection;using System.Runtime.CompilerServices;using System.Threading.Tasks;using System.Windows.Forms;namespace CefSharpDemo{static class Program{/// <summary>/// 應用程序的主入口點。/// </summary>[STAThread]static void Main(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);AppDomain.CurrentDomain.AssemblyResolve += Resolver;LoadApp();}[MethodImpl(MethodImplOptions.NoInlining)]private static void LoadApp(){var settings = new CefSettings();// Set BrowserSubProcessPath based on app bitness at runtimesettings.BrowserSubprocessPath = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase,Environment.Is64BitProcess ? "x64" : "x86","CefSharp.BrowserSubprocess.exe");// Make sure you set performDependencyCheck falseCef.Initialize(settings, performDependencyCheck: false, browserProcessHandler: null);var frmMain = new FrmMain();Application.Run(frmMain);}// Will attempt to load missing assembly from either x86 or x64 subdirprivate static Assembly Resolver(object sender, ResolveEventArgs args){if (args.Name.StartsWith("CefSharp")){string assemblyName = args.Name.Split(new[] { ',' }, 2)[0] + ".dll";string archSpecificPath = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase,Environment.Is64BitProcess ? "x64" : "x86",assemblyName);return File.Exists(archSpecificPath)? Assembly.LoadFile(archSpecificPath): null;}return null;}}}

至此,我們便實現(xiàn)了對 CefSharp 的 AnyCPU 支持。

CefSharp 應用支持 AnyCPU 的優(yōu)缺點與解決方案

眾所周知,相對于 32 位應用程序,64 位的應用擁有更快運行的運行速度,以及支持更多的內存。相對于分別對 x86 和 x64 分別發(fā)包的方式,AnyCPU 發(fā)包減少了運維成本,同時降低了客戶下載程序包之后不能運行的風險。

但是 AnyCPU 的弊端也是很明顯的:64 位的?libcef.dll?文件達到了 110兆,即便是本文所示的簡單示例,全部文件的大小也達到了三百多兆:

要解決這個問題,我們可以在程序運行時動態(tài)去下載對應的依賴文件,該下載操作只要確保在調用 CefSharp 之前即可。

源代碼

本文源代碼:https://gitee.com/coderbusy/demo/tree/master/WinForm/CefSharpDemo

總結

以上是生活随笔為你收集整理的让 CefSharp.WinForms 应用程序同时支持32位(x86)和64位(x64)的解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。