ตัวเลือกสำหรับการฝัง Chromium แทนการควบคุมเว็บเบราเซอร์ IE ด้วย WPF / C #


158

Internet Explorer ตาม WPF เว็บเบราเซอร์ทนทุกข์ทรมานจากบางส่วนควบคุมแป้นพิมพ์และมุ่งเน้นประเด็นและปัญหาหน่วยความจำรั่ว เพื่อเป็นทางเลือกในการแก้ไขปัญหาเหล่านี้เรากำลังพิจารณาตัวเลือกที่พร้อมใช้งานสำหรับการโฮสต์ Chromium แทนการควบคุมเว็บเบราเซอร์ในโครงการ WPF / C # ของเราโดยยึดตามการแก้ไข HTML มีการถามคำถามที่คล้ายกันที่นี่มาก่อน ฉันได้อ่านคำตอบและทำวิจัยของฉันเองแล้วแต่ฉันหวังว่าจะได้รับคำติชมเพิ่มเติมจากผู้ที่ใช้ตัวเลือกต่อไปนี้ในโครงการคุณภาพการผลิต :

AwesomiumและAwesomium.NET

มันดูเหมาะสมมาก แต่ฉันไม่ชอบความจริงที่ว่าโครงการไม่ใช่โอเพ่นซอร์สและไม่สามารถใช้งานซอร์สเต็มได้อย่างง่ายดาย นอกจากนี้อาจเป็นเรื่อง overkill สำหรับโครงการของเราเนื่องจากการแสดงผลนอกหน้าจอไม่ใช่สิ่งที่เราต้องพึ่งพาจริงๆ

Chromium Embedded Framework (CEF)และ. NET ผูกสำหรับ CEF

นี่อาจเป็นตัวเลือกที่ดีที่สุดในขณะนี้ โปรเจ็กต์ดูเหมือนจะมีชีวิตชีวาและแอ็คทีฟขณะนี้กำลังซิงค์กับ Chrome v27 CEF3 ใช้สถาปัตยกรรมแบบหลายกระบวนการของ Chrome นอกจากนี้ยังมีลักษณะเช่น Adobe จะให้มันรับรองบาง

Chrome Frame ของ Google

ในขณะที่จุดประสงค์ดั้งเดิมของมันคือการเป็นปลั๊กอิน HTML5 สำหรับ IE และ Firefox มันใช้งานได้จริงเป็นตัวควบคุม ActiveX แบบสแตนด์อโลนด้วยดังนั้นฉันจึงสามารถใช้มันกับ WPF ได้ มันเปิดเผยAPI ที่เพียงพอสำหรับการโต้ตอบกับหน้าเว็บภายใน ( onmessage, addEventListener/removeEventListener, postMessage) ฉันรู้ว่า Google กำลังจะยกเลิก Chrome Frame แต่ฉันคิดว่าแหล่งที่มาจะยังคงอยู่ในที่เก็บ Chromium ไม่ควรอัปเดตด้วยรหัส Chromium ล่าสุดเมื่อเราไปและเราจะสามารถควบคุมสิ่งนี้ได้อย่างเต็มที่

WebKit .NET wrapper

ไม่ใช้ Chromium อย่างแน่นอนและไม่ได้ใช้โปรแกรม V8 ดังนั้นจึงไม่ใช่ตัวเลือกจริงๆ

มีตัวเลือกอื่นที่ฉันอาจมองข้ามไปหรือไม่?

ฉันจะขอขอบคุณอย่างมากหากมีคนแบ่งปันประสบการณ์ของเขากับตัวเลือกใด ๆ ข้างต้นสำหรับโครงการ WPF คุณภาพสูงในชีวิตจริง คุณมีการบูรณาการการอนุญาตหรือการใช้งานหรือไม่? ขอบคุณ.

[แก้ไข] ฉันอยากจะขอบคุณartlung ที่ให้คำถามนี้ด้วยการให้ข้อเสนอที่ใจดี

คำตอบ:


124

คุณได้แสดงโซลูชันที่โดดเด่นที่สุดแล้วสำหรับการฝัง Chromium (CEF, Chrome Frame, Awesomium) ไม่มีโครงการอื่นอีกแล้วที่มีความสำคัญ

ยังมีโครงการBerkelium (ดูBerkelium SharpและBerkelium Managed ) แต่มันก็ทำให้โครเมียมรุ่นเก่า ๆ

CEFเป็นทางออกที่ดีที่สุดของคุณ - เป็นโอเพ่นซอร์สแบบสมบูรณ์และอัปเดตบ่อยครั้ง เป็นตัวเลือกเดียวที่ให้คุณฝัง Chromium เวอร์ชันล่าสุดได้ ตอนนี้ Per Lundberg กำลังทำงานอย่างหนักในการย้าย CEF 3 ไปยังCefSharpนี่คือตัวเลือกที่ดีที่สุดสำหรับอนาคต นอกจากนี้ยังมีXilium.CefGlueแต่อันนี้ให้ API ระดับต่ำสำหรับ CEF มันผูกกับ C API ของ CEF CefSharp ในทางกลับกันผูกกับ C ++ API ของ CEF

Adobe ไม่ได้เป็นเพียงผู้เล่นที่สำคัญใช้ตระเว ณ ดูการใช้งานที่โดดเด่นอื่น ๆ ที่ใช้ตระเว ณ ในหน้าตระเว ณ วิกิพีเดีย

การอัปเดตChrome Frameจะไม่มีจุดหมายเนื่องจากโครงการที่ได้รับการเกษียณ


คุณลืมที่จะบอกว่าครึ่งสิ่งไม่ทำงาน .. เช่นการล้างคุกกี้แคช .. การตั้งค่าพร็อกซี ฯลฯ เพียงแค่ใช้ Awesomium และช่วยคุณประหยัดปัญหา

4
ฮิฮิตอบ Czarek ดีขอบคุณสำหรับเครดิต :) (ไม่เคยเห็นสิ่งนี้มาก่อน)
ต่อ Lundberg

4
แน่นอนว่าควรค่าแก่การชี้: อาจมีบางสิ่งที่ "หายไป" ในโครงการโอเพนซอร์สอย่างชัดเจน Xilium.CefGlue และ CefSharp ไม่มีข้อยกเว้นใด ๆ สำหรับกฎนั้น สิ่งที่ดีเกี่ยวกับโอเพ่นซอร์สคือคุณสามารถใช้เวลาในการมองปัญหาเล็ก ๆ น้อย ๆ และรวมการแก้ไขของคุณ เราเห็นว่าเป็นครั้งคราวกับ CefSharp และมันก็ค่อนข้างเรียบร้อย
ต่อ Lundberg

1
แก้ไขให้ถูกต้องหากฉันผิด แต่ CefSharp ไม่ต้องการ DLLs ที่มีขนาดเกิน 50MB หรือไม่ นั่นส่งผลให้เกิดการติดตั้งครั้งใหญ่ libcef.dll ถูกระบุว่าเป็นการพึ่งพาที่สำคัญและเป็น 38MB
Krafty

2
@Krafty การตั้งค่าการติดตั้งช่วยให้สามารถบรรจุได้โดยใช้อัลกอริธึมเช่น 7z และผลลัพธ์นี้ลดขนาดลงจาก 55 MB -> เป็น 17 MB ขนาด CefSharp นั้นมีขนาดไม่มากเมื่อเทียบกับ Google Chrome ซึ่งมีขนาด 152 MB ที่แกะกล่องและติดตั้งแล้วขนาด 40 MB
Czarek Tomczak

11

เรามีความท้าทายที่เหมือนกันในบางเวลาที่ผ่านมา เราต้องการไปกับ CEF3 โอเพ่นซอร์สไลบรารีซึ่งใช้ WPF และรองรับ. NET 3.5

ประการแรกผู้เขียนของตัวเองตระเว ณ จดทะเบียนที่มีผลผูกพันสำหรับภาษาที่แตกต่างกันที่นี่

ประการที่สองเราไปข้างหน้าด้วยโอเพนซอร์ส. NET CEF3 ซึ่งมีชื่อว่าXilium.CefGlueและประสบความสำเร็จเป็นอย่างดี ในกรณีที่บางสิ่งบางอย่างไม่ทำงานอย่างที่คุณคาดไว้ผู้เขียนมักจะตอบสนองต่อปัญหาที่เปิดในตัวติดตามบิตบิลด์ในตัว

จนถึงตอนนี้มันมีบริการเราดี ผู้เขียนอัปเดตห้องสมุดของเขาเพื่อสนับสนุน CEF3 ล่าสุดและการแก้ไขข้อผิดพลาดบนฐานปกติ


2
นี่คือจุดหนึ่ง (มาจาก "ด้านอื่น ๆ " ซึ่งเป็น CefSharp ในเรื่องนี้) - CefSharp คือ 4.0 เพียงไม่กี่เดือนเนื่องจากปัญหาสนับสนุน 3.5 กับชุดเครื่องมือ VS ที่ใหม่กว่า (VS2010 + ไม่สามารถรองรับกรอบเก่ากับ C ++ / CLI ซึ่งค่อนข้างเศร้าเพราะมันบังคับให้เราใช้. NET 4 หรือ Visual Studio เวอร์ชันเก่าจริงๆ ... )
ต่อ Lundberg

8

นี่คืออีกหนึ่ง:

http://www.essentialobjects.com/Products/WebBrowser/Default.aspx

อันนี้ก็ขึ้นอยู่กับเครื่องยนต์ Chrome ล่าสุด แต่ใช้งานง่ายกว่า CEF มาก มันเป็น. dll dll เดียวที่คุณสามารถอ้างอิงและใช้งานได้


การสนับสนุนก็ยอดเยี่ยมเช่นกัน
huseyint

3
ดูเหมือนว่าข้อมูลพื้นฐานหายไปในเว็บไซต์นั้น - มี Chrome รุ่นใดบ้าง
Czarek Tomczak

2
เอ่อไม่ฟรี ไม่ฟรี. พวกนี้คิดอะไรกัน? :)
dkellner

ควรระบุไว้ตรงนี้ว่าในขณะที่มีรุ่นทดลองไม่ฟรี
ewilan

8

ดูห้องสมุดDotNetBrowser ที่พัฒนาโดยทีมของฉัน มันให้การควบคุมเบราว์เซอร์ที่ใช้ WPF และ WinForms บนโครเมียมซึ่งค่อนข้างง่ายต่อการฝังลงในแอปพลิเคชัน. NET รองรับมาตรฐานเว็บที่ทันสมัยทั้งหมดรวมถึง HTML5, CSS3 และ JavaScript หน้าเว็บที่แสดงผลดูเหมือนใน Google Chrome

ห้องสมุดสืบทอดสถาปัตยกรรมหลายขั้นตอนของ Chromium - แต่ละหน้าเว็บจะแสดงผลในกระบวนการ Chromium แยกต่างหากและแอปพลิเคชันจะทำงานต่อไปแม้หลังจากปลั๊กอินขัดข้องหรือข้อผิดพลาดอื่น ๆ ที่ไม่คาดคิดเกิดขึ้นบนหน้าเว็บ

นี่คือคุณสมบัติที่มีประโยชน์อื่น ๆ ที่มีให้โดย DotNetBrowser: เป็นไปได้ที่จะฟังเหตุการณ์โหลดจัดการกับกิจกรรมเครือข่ายกำหนดค่าพร็อกซีจำลองการกระทำของผู้ใช้ทำงานกับคุกกี้เข้าถึงและแก้ไข DOM ฟังเหตุการณ์ DOM โทร JavaScript จาก. NET และในทางกลับกันการใช้กล้องเว็บและไมโครโฟนบนหน้าเว็บ, การตั้งค่าการสื่อสาร WebRTC ที่ใช้และอื่น ๆ อีกมากมาย

ตรวจสอบการอ้างอิง APIสำหรับรายละเอียดเพิ่มเติม

ข้อมูลโค้ดด้านล่างแสดงวิธีสร้าง BrowserView ฝังไว้ในแบบฟอร์มและโหลด URL:

using System.Windows.Forms;
using DotNetBrowser;
using DotNetBrowser.WinForms;

namespace WinForms.DotNetBrowser
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            BrowserView browserView = new WinFormsBrowserView();
            Controls.Add((Control) browserView);
            browserView.Browser.LoadURL("http://www.youtube.com");
        }
    }
}

เมื่อคุณเรียกใช้ตัวอย่างข้างต้นคุณจะได้รับผลลัพธ์ต่อไปนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ห้องสมุดเป็นเชิงพาณิชย์ ใบอนุญาตการค้ารวมถึงแพ็คเกจสนับสนุนสำหรับขนาดทีมต่าง ๆ นอกจากนี้ยังเป็นไปได้ที่จะซื้อรหัสที่มาของห้องสมุด

นอกเหนือจากหน้าของตัวเองแล้วส่วนประกอบจะพร้อมใช้งานเป็นแพ็คเกจ NuGetและเป็นแพ็คเกจ VSIXใน Visual Studio Marketplace


1
ดูถูกต้องและฉันได้ฝังรุ่นทดลองในแอพของฉัน ปัญหาเดียวคือมันเป็นผลิตภัณฑ์เชิงพาณิชย์และใบอนุญาตไม่ถูกมาก มิฉะนั้นก็ดูแข็งแกร่งสำหรับฉัน
DoronG

น่าเศร้า DotNetBrowser ไม่ได้ฟรี! : /
Deniz

4

ฉันใช้ Awesomium.NET แล้ว แม้ว่าฉันจะไม่ชอบความจริงที่ว่ามันไม่ใช่โอเพ่นซอร์สและความจริงที่ว่ามันใช้เอนจิ้นการแสดงผล Webkit แบบเก่า แต่ก็ใช้งานง่ายมาก นั่นเป็นเรื่องของการรับรองเพียงอย่างเดียวที่ฉันสามารถให้ได้


1
คุณสามารถแบ่งปันฐานผู้ใช้ของคุณที่มีขนาดใหญ่สำหรับโครงการนั้นได้หรือไม่
noseratio

ฉันไม่เคยปรับใช้โครงการดังนั้นฐานผู้ใช้จึงเป็นศูนย์ ฉันกำลังทดลองกับตัวเลือกเท่านั้น
Ming Slogar

2
ฉันได้รับความช่วยเหลือเป็นเวลาหลายเดือนที่สนับสนุนแอป C # ที่ใช้ Awesomium มันอาจจะเป็นเกม C ++ แต่ใน C # การควบคุมเบราว์เซอร์ของพวกเขานั้นค่อนข้างบ้าคลั่ง การปรับใช้ที่ซับซ้อน (คุณต้องมีตัวติดตั้งแปลก ๆ เพื่อเพิ่มเนื้อหาลงใน GAC) พฤติกรรมการบั๊ก (บางครั้งมันเริ่มต้นด้วยหน้าจอสีดำผู้ใช้ต้องรีสตาร์ทแอปด้วยตนเอง) และความเร็วช้า (หน้าเว็บไม่แสดงขณะโหลด มันจะแขวนจนกว่าจะโหลดหน้าเต็ม / ครึ่งและใช้เวลา 5-10 วินาทีในการเริ่มต้นบนเครื่อง
ช้า

5
ในที่สุดฉันก็ไปกับ CefSharp และผลลัพธ์ก็น่าทึ่ง การเริ่มต้น <100 ms (เช่นเริ่มทันที) และไม่มี "ข้อบกพร่อง" แค่ใช้งานได้ เท่าที่ควร นอกจากนี้ CefSharp ไม่จำเป็นต้องเพิ่มลงใน GAC ดังนั้นจึงไม่จำเป็นต้องทำการเปลี่ยนแปลงตัวติดตั้ง เพียงแค่คัดลอกไฟล์ของคุณและไป ฉันพูดถึง CEF / CefSharp ดีกว่าทุก Mozilla / WebKit C # library ที่ฉันทดสอบหรือไม่ โอ้และเพราะสวรรค์ไม่ได้ใช้ IE มันได้ผล. ใช่มันทำได้ แต่มันขาดคุณสมบัติโดยสิ้นเชิงและทำงานได้แย่มาก (ความเร็ว)
TheFlash

1
@RobinRodricks ประสบการณ์ของฉันก็เหมือนกัน ฉันเกือบยอมแพ้แนวทาง แต่แล้วฉันก็พบ CefSharp :-) (และใครที่สนใจประมาณสองสาม MBs วันนี้เมื่อไดรเวอร์เครื่องพิมพ์มาบน DVD :-)?)
Xan-Kun Clark-Davis


2

ฉันมีปัญหาเดียวกันกับโปรแกรมอ่าน RSS WPF ของฉันฉันไปกับ Awesomium (ฉันคิดว่ารุ่น 1.6) Awesomium นั้นยอดเยี่ยม คุณได้รับการควบคุมจำนวนมากสำหรับการแคช (รูปภาพและเนื้อหา HTML) การใช้งาน JavaScript การสกัดกั้นการดาวน์โหลดและอื่น ๆ นอกจากนี้ยังเร็วสุด การแยกกระบวนการหมายถึงเมื่อเบราว์เซอร์ขัดข้องไม่ทำให้แอปขัดข้อง

แต่มันก็ยังหนักอยู่ดีถึงแม้จะปล่อย build เพิ่มประมาณ 10-15mb (จำไม่ได้ว่าจำนวนที่แน่นอน) และด้วยเหตุนี้จึงเป็นบทลงโทษที่เริ่มต้นขึ้นเล็กน้อย ฉันรู้แล้วปัญหาเดียวที่ฉันมีกับการควบคุมเบราว์เซอร์ IE คือมันจะทำให้เกิดข้อผิดพลาด JavaScript ทุกครั้งคราว แต่นั่นแก้ไขด้วยตัวอย่างต่อไปนี้

ฉันแทบจะไม่ได้ใช้แอพของฉันใน XP หรือ Vista แต่ใน Win 7 ขึ้นไปมันไม่เคยมีปัญหาเลย (อย่างน้อยก็ไม่ใช่เพราะฉันใช้การควบคุมเบราว์เซอร์ IE)

IOleServiceProvider sp = browser.Document as IOleServiceProvider;
if (sp != null)
{
    IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046");
    Guid IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11d0-8A3E-00C04FC9E26E");

    webBrowser;
    sp.QueryService(ref IID_IWebBrowserApp, ref IID_IWebBrowser2, out webBrowser);
    if (webBrowser != null)
    {
        webBrowser.GetType().InvokeMember("Silent", 
                BindingFlags.Instance | BindingFlags.Public | BindingFlags.PutDispProperty, null, webBrowser, new object[] { silent });
    }
}

ขอบคุณสำหรับคำตอบ. ในที่สุดคุณก็หันกลับไปหา IE จาก Awesomium หรือไม่?
noseratio

ใช่ฉันทำ. และฉันก็มีความสุข ฉันใช้ ClickOnce ดังนั้นการติดตั้งใช้งานจึงน้อยมากและไม่มีการหยุดทำงาน
Sameer Vartak

ขอบคุณฉันได้รับคำตอบแล้ว BTW มีวิธีอื่นในการรับIWebBrowser2ส่วนต่อประสานภายใน
noseratio

เย็น. ตัวควบคุม Activex ทำงานอย่างไรใน WPF ขอบคุณสำหรับการโหวต :-)
Sameer Vartak

ขออภัยไม่ได้อ่านลิงก์อ้างอิงอย่างรอบคอบ ใช่มันเป็นตัวอย่าง XAML และใช้งานได้ ขอบคุณ
Sameer Vartak

1

ไมโครซอฟท์ปล่อย " ไมโครซอฟท์ขอบ WebView2 " ควบคุม WPF ว่าจะได้รับเราดีตัวเลือกฟรีสำหรับการฝังโครเมียมข้ามของ Windows 10, Windows 8.1 หรือ Windows 7 มันสามารถใช้ได้ผ่าน Nuget Microsoft.Web.WebView2เป็นแพคเกจ


นี่คือตัวเลือกที่ดีแม้ว่ามันจะเป็นปี 2020 และในวันเหล่านี้ฉันจะมองหาวิธีการแก้ปัญหาข้ามแพลตฟอร์มเช่นChromely
noseratio

1
ฉันคิดว่ามันขึ้นอยู่กับว่าคุณกำลังมองหาการเพิ่มเนื้อหาเว็บลงในแอปเดสก์ท็อปหรือแอปเดสก์ท็อปที่สร้างขึ้นเช่นเว็บแอป ฉันคิดว่าคุณจะใช้ WebView2 เฉพาะเมื่อมันเป็นเรื่องเล็ก ๆ น้อย ๆ ของเว็บเดสก์ท็อป
scottheckel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.