狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

將瀏覽器嵌入 .NET 應用程序中:DotNetBrowser 還是 CefSharp?

admin
2023年7月4日 11:2 本文熱度 680

為 WPF 或 WinForms 應用程序選擇瀏覽器組件,對于那些搜索基于Chrome的解決方案的人來說,DotNetBrowser[1]CefSharp[2]是最明顯的選擇。

本文是我們的客戶在考慮其項目的開源庫和商業庫時提出的最常見比較點的匯編。

引擎

CefSharp 實際上是 Chromium Embedded Framework[3] (CEF) 的 .NET 包裝器。包裝通過 C++/CLI 完成。

DotNetBrowser 在底層不使用 CEF 或 C++/CLI。相反,它采用了自己的方法直接與 Chromium 集成。它啟動一個功能齊全的 Chromium 引擎,并通過進程間通信 (IPC) 與其進行通信。

架構

在 CefSharp 中,Chromium 引擎直接在您的 .NET 進程中初始化[4]。初始化和關閉都必須在主應用程序線程(通常是 UI 線程)中執行。在不同的線程中調用它們通常會導致凍結。

此外,每個進程可以執行一次初始化和關閉。這個限制來自 CEF 本身,在執行關閉后嘗試重新初始化 CefSharp 將導致錯誤。


CefSharp architecture


在 DotNetBrowser 中,Chromium 引擎在單獨的本機進程中進行初始化。不需要在主 UI 線程上執行此操作——即使在工作線程中也可以執行此操作。

您可以同時初始化和使用具有不同配置的多個 Chromium 引擎,這在 CefSharp 中是不可能的。您可以在不再需要 Chromium 時將其關閉并隨時重新初始化。


DotNetBrowser architecture


穩定性和內存使用

在單獨的進程中運行 Chromium 有更多優點:

  1. 在這種情況下,內存消耗要低得多,這對于 32 位應用程序來說似乎很關鍵。

  2. 在 CefSharp 中,如果 CEF 或 C++/CLI 綁定內部出現問題,這將導致整個 .NET 應用程序崩潰而無法處理這種情況。這就不太妙了,因為 .NET 應用程序可能會丟失或損壞用戶的數據。

對于 DotNetBrowser,Chromium 內部的錯誤不會導致 .NET 應用程序崩潰。此外,甚至可以在托管代碼中正確檢測和處理這一切。例如,如果發生這種情況,那么您可以重新初始化 Chromium 并恢復用戶會話。

應用程序域

由于其架構,CefSharp 不能在非默認 AppDomain 中使用[5]。因此,它不能用于通過 VSTO 插件或 Excel-DNA 將 Chromium 嵌入到 Office 應用程序中。Office VSTO 將加載項加載到單獨的 AppDomain 中[6]以進行隔離。

DotNetBrowser 在非默認 AppDomain 中運行。事實上,可以在不同的 AppDomain 中創建多個 Chromium 引擎并同時使用它們。因此,DotNetBrowser 可用于創建 VSTO 加載項。

AnyCPU

在針對 AnyCPU 的應用程序中使用 CefSharp 時,您會發現它在這些應用程序的 64 位環境中無法正常工作。

這兒有幾個選項[7]可以解決這個問題。其中之一是讓您的應用程序始終在 32 位模式下運行,另一個更復雜,需要修改項目文件(.csproj 或 .vbproj)和代碼。

在 DotNetBrowser 中,AnyCPU 支持開箱即用。因此,不需要類似的調整。

H.264, AAC

視頻和音頻通常使用專有編解碼器進行編碼,例如 H.264 和 AAC。此媒體無法在 CefSharp 中播放。

要在 CefSharp 中啟用這些編解碼器,您需要在啟用專有編解碼器的情況下自行重建 CEF。這是一項相當復雜的任務,可能需要長達一個月的時間[8]

在 DotNetBrowser 中默認禁用專有編解碼器。可以通過編程方式啟用它們,而無需重建庫。

安全

Chromium 通過利用操作系統為它們提供的安全性來限制其渲染器和實用程序進程。此功能稱為 Chromium沙箱[9]。其主要目的是防止第三方代碼對計算機進行持久更改或訪問機密信息。

CefSharp 不支持 Chromium 沙箱[10]。這個限制來自 CEF 本身,DotNetBrowser 支持沙箱并默認啟用。如有必要,可以在初始化期間將其禁用[11]

CefSharp 在 .NET 進程中啟動 Chromium。這使您的應用程序容易受到 CEF 和 Chromium 中的漏洞的影響。如果惡意軟件獲得了對 Chromium 內存的訪問權,它也會獲得對 .NET 內存的訪問權。DotNetBrowser 在單獨的進程中啟動 Chromium。Chromium 漏洞保留在 Chromium 中。

Visual Studio設計器

現代 WPF 和 Windows 窗體應用程序通常是在設計器的幫助下在 Visual Studio 中創建的。這種方法總體上簡化了 UI 創建并節省了大量時間和精力。

CefSharp 提供有限的設計器支持[12]。如果應用程序本身以 x86 為目標,則其控件將在設計器中正確處理。AnyCPU 可能會工作,但尚未經過徹底測試。

DotNetBrowser 控件是純 UI 控件,它們在代碼中顯式初始化。您可以在設計器中不受任何限制地使用它們。安裝 NuGet 包或 VSIX 擴展后,BrowserView 控件出現在工具箱中。它可以像任何其他常規 UI 控件一樣被拖到窗體或窗口上。

嵌入應用程序 UI

CefSharp 提供 WPF 和 Windows 窗體支持。但是,它的 WPF 實現只能在 離屏渲染模式[13] 下工作。此實現具有有限的觸摸屏和IME[14]支持。

DotNetBrowser 在兩種渲染模式下同時支持 WPF 和 Windows 窗體。在硬件加速模式下,觸摸、手勢和 IME 由 Chromium 自行處理,因此它們開箱即用。在離屏模式下,存在一些已知的限制[15]

以下是將 CefSharp 嵌入 WPF 窗口的方法:

就是這樣,在最簡單的情況下,不再需要編寫代碼。但是,在這種情況下,CefSharp 初始化和關閉是隱式執行的,很難確定它是否已經在某個點初始化。

將 DotNetBrowser 嵌入 WPF 窗口的過程需要額外的步驟。例如:

MainWindow.xaml 

MainWindow.xaml.cs

在這里,大部分代碼都與 Chromium 實例和 IBrowser  實例的顯式初始化和關閉有關。UI 控件初始化是通過調用 Initializefrom() 顯式執行的。這種方法可以更好地控制初始化和關閉過程,并且更容易自定義初始 Chromium 配置。

高DPI

在 CefSharp 中,瀏覽器子進程的默認 DPI 感知[16]是 Per-Monitor。因此,桌面應用程序應具備DPI 感知功能[17],才能在高 DPI 顯示器(DPI 比例設置大于 100% 的顯示器)上正確運行。在其他情況下,瀏覽器內容可能無法正確呈現,例如:



DotNetBrowser 以不同的方式支持高 DPI。在初始化過程中,它會檢查當前進程的 DPI 感知,并為相應的 Chromium 引擎設置匹配的 DPI 感知。因此,無需讓您的應用程序顯式識別 DPI 以避免在高 DPI 顯示上呈現偽影。



無頭

DotNetBrowser 和 CefSharp 都可以在沒有 UI 的應用程序中使用。

在 CefSharp 中,CefSharp.OffScreen.Chromium   WebBrowser 用于此目的。初始化過程通常保持不變。但是,如果您的代碼使用 async/await 模式,則需要使用同步上下文來確保在主線程上而不是在不同的工作線程上執行初始化和關閉。


要在沒有 UI 的應用程序中使用 DotNetBrowser,您需要像往常一樣執行初始化。在這種情況下,沒有需要初始化的 BrowserView。即使您的代碼使用async/await模式,也無需創建和使用同步上下文。

API和功能

這兩種產品都有許多可用的功能。在本文中,我將比較幾個最重要的,以展示 API 的不同之處。

DOM訪問

在 CefSharp 中,您只能通過執行 Javascript 調用來訪問 DOM。例如:

DotNetBrowser 提供了豐富的 DOM API,可用于直接從 .NET 執行以下操作:

  • 訪問和修改 DOM 樹;
  • 更改 HTML 元素屬性;
  • 訂閱 DOM 事件并從 .NET 代碼中調度它們。

例如,以下是如何在 DotNetBrowser 中的網頁上執行相同的操作:

因此,在 DotNetBrowser 中與網頁執行復雜的交互要方便得多。無需編寫難以調試和支持的復雜 Javascript 代碼。

DotNetBrowser 中的 DOM API 不是一組 Javascript 調用的包裝器。它直接對 Blink 引擎進行 IPC 調用。

與Javascript交互

執行Javascript并處理結果

CefSharp 和 DotNetBrowser 都提供了在網頁上執行 Javascript 的能力。

在 CefSharp 中,有兩種方法可用于此目的,executeJavascriptAsync 和 EvaluatescriptAsync。兩者都可用于瀏覽器本身(通過擴展方法)或其中的一個框架:

然后使用 JavascriptResponse.Result 獲取執行結果。

可能的結果類型有  bool, int, long, double, string, List, IDictionary<string, object>,  和 IJavascriptCallback。這里的集合是 Javascript 集合的快照表示,而 IJavascriptCallback 是一種 Javascript 函數表示,可用于從 .NET 端執行它。


在 DotNetBrowser 中,有  IFrame.executeJavascript() 用于此目的。此方法的通用版本可用于顯式指定預期的返回類型:

這里的主要區別是可以將 Javascript 對象表示為IJsObject。使用此接口,您可以訪問和修改 Javascript 對象的屬性并調用其方法。在 .NET 端對 IJsObject 所做的所有更改都將立即反映在 Javascript 端。此外, executeJavascript 調用可以返回一個 IElement,這是一個 DOM 元素的表示,您可以使用它來訪問和修改 DOM 屬性或訂閱 DOM 事件。

從Javascript調用.NET

CefSharp 和 DotNetBrowser 都可以使網頁上的 Javascript 可以訪問 .NET 對象,但是,CefSharp 存在一些特定的限制。

CefSharp Javascript 綁定可用于 Javascript 和 .NET 之間的通信 但是,CefSharp 不允許[18]將Form, Window 或任何Control注入 Javascript。另外,CefSharp 只支持調用注入對象的方法。如果需要設置屬性,則必須修改類并創建 Get/Set 方法。

在 DotNetBrowser 中,您可以將任何對象注入 Javascript,包括  Form, Window 和 Control 對象。執行注入后,您可以訪問注入的 .NET 對象的公共字段、屬性和方法。此外,DotNetBrowser 支持從 Javascript 訪問索引屬性(使用字符串或數字索引器)。如果您需要從 Javascript 訪問 .NET 集合,這會很有幫助。

截屏

兩種解決方案都支持在瀏覽器不可見時進行截屏。但是,API 有明顯不同。以下是代碼片段:



Taking a screenshot in CefSharp Taking a screenshot in DotNetBrowser



主要的 DotNetBrowser DLL 不使用 System.Drawing 中的類型,因為它的限制[19],因此,它提供了自己的類型。然后可以通過 DotNetBrowser.Wpf 或 DotNetBrowser.WinForms 中提供的擴展方法將此類型轉換為常規 System.Drawing.Bitmap。

分發和部署

CefSharp 需要 Microsoft Visual C++ 運行時存在于環境中[20]。Visual C++ 2015 是最低版本,但所需的確切版本取決于 Chromium 版本。因此,需要在您希望運行基于 CefSharp 的應用程序的每臺機器上預安裝 Microsoft Visual C++ Redistributable Package,將其設置為安裝程序的依賴項,或將其 DLL 打包為應用程序的一部分,并確保 CefSharp 正確找到它們。

在 DotNetBrowser 中,所有必需的 Chromium 二進制文件和 DLL 都已打包到 DotNetBrowser DLL 中,并且可以在執行期間自動提取。您無需預先安裝 Microsoft Visual C++ Runtime 即可使用 DotNetBrowser。

支持和更新

CefSharp 是一個開源項目。如果您發現錯誤或缺少功能,您可以提出建議[21]

DotNetBrowser是為使用.NET開發軟件的商業公司設計和創建的商業產品,對集成第三方解決方案的質量和支持有很高的要求。自 2015 年以來,TeamDev 開發并支持 DotNetBrowser。

我們所有已訂閱有效標準支持[22]的客戶都可免費使用所有DotNetBrowser 新版本并獲得技術支持。如果您發現錯誤或缺少功能,我們將應用修復程序,實施所需功能,并根據任務的復雜性在幾天或幾周內為您提供新版本的庫。

幾乎每個月都會發布一個新版本的 DotNetBrowser。我們會在 Chromium 正式發布后的 3-4 周內將 Chromium 升級到最新的穩定版本(帶有最新的安全補丁和修復的漏洞)。

概括

因為開源和免費,CefSharp 被廣泛使用。它很容易為基本案例進行配置,并且擁有廣泛的文檔和活躍的開源開發者社區。

但是,它具有來自其設計和架構的限制。缺少沙盒支持使其安全性降低,并且進程內方法會影響穩定性并增加應用程序的內存使用量。

它也不能用于暗示在單獨的 AppDomain(如 VSTO)中運行代碼的環境。對于其他一些情況,例如播放使用專有編解碼器編碼的內容,您必須自己構建、更新和維護 CEF。這需要大量額外的工作和基礎設施。

與加載的網頁的復雜交互會通過 Javascript 注入執行,這使得生成的代碼更難調試和支持。

DotNetBrowser 簡化了所有這些案例的開發過程——由于它的進程外架構,它可以用于創建更穩定和安全的解決方案。使用 DotNetBrowser,您可以與需要在單獨的 AppDomain 中運行代碼的應用程序集成,并在網頁上執行復雜的操作,而無需進行大量的 Javascript 注入。


參考資料

[1] DotNetBrowser: https://teamdev.com/dotnetbrowser/?utm_campaign=dotnetbrowser-articles&utm_medium=article&utm_source=medium

[2] CefSharp: http://cefsharp.github.io/

[3] Chromium Embedded Framework: https://bitbucket.org/chromiumembedded/cef/src/master/

[4] 引擎直接在您的 .NET 進程中初始化: https://github.com/cefsharp/CefSharp/wiki/General-Usage

[5] CefSharp 不能在非默認 AppDomain 中使用: https://github.com/cefsharp/CefSharp/wiki/General-Usage

[6] 將加載項加載到單獨的 AppDomain 中: https://learn.microsoft.com/en-us/visualstudio/vsto/architecture-of-vsto-add-ins?view=vs-2022

[7] 幾個選項: https://github.com/cefsharp/CefSharp/issues/1714

[8] 可能需要長達一個月的時間: https://greenlightstudionet.wordpress.com/2019/10/09/stream-netflix-in-your-c-sharp-program/

[9] Chromium沙箱: https://www.google.com/googlebooks/chrome/med_26.html

[10] 不支持 Chromium 沙箱: https://github.com/cefsharp/CefSharp/wiki/General-Usage

[11] 在初始化期間將其禁用: https://dotnetbrowser-support.teamdev.com/docs/guides/gs/chromium.html

[12] 提供有限的設計器支持: https://github.com/cefsharp/CefSharp/wiki/General-Usage

[13] 離屏渲染模式: https://github.com/cefsharp/CefSharp/wiki/General-Usage

[14] IME : https://github.com/cefsharp/CefSharp/issues/1262

[15] 已知的限制: https://dotnetbrowser-support.teamdev.com/docs/guides/gs/browser-view.html

[16] 默認 DPI 感知: https://github.com/cefsharp/CefSharp/wiki/General-Usage

[17] DPI 感知功能: https://learn.microsoft.com/en-us/windows/win32/hidpi/high-dpi-desktop-application-development-on-windowse

[18] 不允許: https://github.com/cefsharp/CefSharp/wiki/General-Usage

[19] 因為它的限制: https://learn.microsoft.com/en-us/dotnet/api/system.drawing?view=netstandard-2.0

[20] 需要 Microsoft Visual C++ 運行時存在于環境中: https://github.com/cefsharp/CefSharp/wiki/Output-files-description-table-%28Redistribution%29

[21] 提出建議: https://github.com/cefsharp/CefSharp

[22] 標準支持: https://dotnetbrowser-support.teamdev.com/getting-help/

[23] 聯系并獲得幫助: https://dotnetbrowser-support.teamdev.com/getting-help/?utm_campaign=dotnetbrowser-articles&utm_medium=article&utm_source=medium


該文章在 2023/7/4 11:02:24 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved