在VB6应用程序中将C#dll与Cefsharp一起使用

时间:2019-08-10 22:29:47

标签: c# dll vb6 com-interop cefsharp

我正在更新vb6中通过COM互操作调用Winform C#dll的程序。在此C#dll中,winform包含一个实例化Internet Explorer(.NET默认浏览器)的Web浏览器。对于兼容性问题,我需要嵌入Chromium。我决定选择CefSharp。

我已经在C#中建立了一个名为dll的测试项目,并且工作正常。 我已经阅读了CefSharp Wiki,它们精确地从主UI线程初始化/关闭Cef。因此,我在C#中声明了两个在VB6中直接调用的方法。 问题是:表单可以很好地加载并且带有CefSharp的浏览器正在运行。当我关闭表单并想再次启动它时,应用程序将关闭。 我还尝试在C#dll中初始化/关闭CefSharp,但没有成功。

关于在这种情况下如何正确使用Ce​​fSharp的任何想法? 谢谢

Public gTest as boolean
Option Explicit

Public Function LaunchDLL() As Boolean

Dim oExtApp: Set oExtApp = CreateObject("TestCefSharp.Class2")
Dim test As Boolean

Dim bResult     As Boolean

    LaunchDLL = False
    On Error GoTo Erreur

    If gTest = False Then
        oExtApp.InitializeChromium
        gTest = True
    End If
    LaunchDLL = oExtApp.LaunchingForm

    Set oExtApp = Nothing

    Exit Function

Erreur:
MsgBox Err.Description
End Function

Public Sub LaunchBrowser_Click()
Dim test As Boolean
Dim Chrome As Boolean

test = LaunchDLL()
End Sub

namespace TestCefSharp
{
    public interface IExternalApp
    {
        bool LaunchingForm();

        bool InitializeChromium();

        bool ShutdownChromium();
    }
    public abstract class CExternalApp : IExternalApp
    {

        public CExternalApp()
            : base()
        {

        }

        public bool LaunchingForm()
        {
            bool test = false;
            MessageBox.Show("Starting");
            Form1 form1 = new Form1();
            DialogResult result = form1.ShowDialog();
            if (result == DialogResult.OK)
            { test = true; }
            else
            { test = false; }
            return test ;
        }

        public bool InitializeChromium()
        {
            MessageBox.Show("Chromium initialized");
            bool result = false;
            try
            {
                CefSharpSettings.SubprocessExitIfParentProcessClosed = true;
                CefSharpSettings.ShutdownOnExit = false;
                Cef.EnableHighDPISupport();

                var settings = new CefSettings()
                { CachePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "CefSharp\\Cache")};

                Cef.Initialize(settings);
                result = true;
            }
            catch
            { }
            return result;
        }

        public bool ShutdownChromium()
        {
            MessageBox.Show("Chromium ended");
            bool result = false;
            try
            {
                Cef.Shutdown();
                result = true;
            }
            catch
            { }
            return result;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

实际上,它不适用于VB6编辑器的调试模式... 如果我直接编译并启动可执行文件,则一切正常。

我必须进一步深入研究,但我认为这是因为VB6编辑器没有像VS2017在.NET中那样在调试中启动单独的线程。

无论如何,谢谢您的帮助。