Interop用户控件中的CEFSharp(Chromium Embedded Framework)

时间:2013-12-11 15:12:33

标签: .net vb.net interop chromium-embedded cefsharp

我正在尝试使用Chromium Embedded Framework的CefSharp CLR绑定创建一个替代的Web浏览器控件,我们可以将其嵌入到仅支持旧版ActiveX控件(WonderWare InTouch HMI)的应用程序中,以获得一些HTML5支持对于一些reeaaallly旧机器。

到目前为止,我已经使用Microsoft InteropForms Toolkit创建了一个Interop用户控件,并以非常简单的方式将CefSharp.WinForms WebView嵌入到控件中,即

Private Sub WebControl_Load(sender As Object, e As EventArgs) Handles Me.Load

    Dim Settings = New CefSharp.Settings
    If (CEF.Initialize(Settings)) Then
        WebView = New WebView(homepage, New BrowserSettings())
        WebView.Dock = DockStyle.Fill
    End If

    Me.Controls.Add(WebView)

End Sub

当我构建DLL时,我通过命令

注册它
  

regasm / tlb / codebase Cefsharp.WebControl.dll

这似乎在很大程度上起作用,但我遇到了一些我不完全理解的问题。我正在使用Excel中的VBA表单进行测试(纯粹是出于方便),当我使用表单生成器时,它实际上在将控件添加到用户表单并初始化加载网页时初始化控件:

IDE Example

但是,当我尝试显示UseForm时,它似乎要么破坏句柄或webview的实例(或两者),我也无法弄清楚如何修复它。一旦我尝试显示表单并尝试类似

Sub Test()
    WebForm.Show
    WebForm.WebControl.Navigate "www.google.com"
End Sub

我收到对象不存在的错误。我已经搞砸了一下,有时我得到不同的错误,如指针无效,但到目前为止,我还没有弄清楚如何正确设置它。我认为这是处理用户表单事件的问题,但我不确定。

如果有人对此有任何见解,我将非常感激。谢谢!

1 个答案:

答案 0 :(得分:0)

好的,我明白了!我认为这部分与处理程序有关,部分与我/何时初始化webview有关。我使用的解决方案最终使用CefSharp.Wpf而不是Windows窗体,但它大致相同。主要区别是在WebControl Designer上添加ElementHost控件的初始化,并在组件初始化过程中创建新的WebView:

'Do not change this subroutine in the code editor. Use the designer.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
    Me.WebHost = New System.Windows.Forms.Integration.ElementHost()
    Me.SuspendLayout
    '
    'WebHost
    '
    Me.WebHost.Dock = System.Windows.Forms.DockStyle.Fill
    Me.WebHost.Location = New System.Drawing.Point(0, 0)
    Me.WebHost.Name = "WebHost"
    Me.WebHost.Size = New System.Drawing.Size(404, 244)
    Me.WebHost.TabIndex = 0
    Me.WebHost.Text = "WebHost"
    Me.WebHost.Child = New WebView(homepage, New CefSharp.BrowserSettings)
    '
    'WebControl
    '
    Me.AutoScaleDimensions = New System.Drawing.SizeF(6!, 13!)
    Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
    Me.Controls.Add(Me.WebHost)
    Me.Name = "WebControl"
    Me.Size = New System.Drawing.Size(404, 244)
    Me.ResumeLayout(false)

End Sub

Friend WithEvents WebHost As System.Windows.Forms.Integration.ElementHost