help: 从 VB6 项目调用 C# winforms dll?

pav*_*red 2 c# windows vb6 dll interop

我有一个 VB6 项目(windows 应用程序),我必须在 C#.net 中的现有 VB6 项目中重新开发一个模块。

我在 C#.net 中开发的模块应该是一个 dll 并且应该包含一些 Windows 窗体。我能够从我的 vb6 项目中成功调用 ac# console applicaiton dll,但是当我尝试从我的 VB6 项目中使用 winforms 调用 C# 类库时遇到了问题。

这就是我为我的概念证明所做的 - 这是我的 C#.net 类库项目中的一个类文件。

namespace TestDll
{
    public interface IClass1
    {
        void DisplayMessage();
    }


    public class Class1:IClass1
    {              
        void IClass1.DisplayMessage()
        { 
            MessageBox.Show ("Displyaing message");
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

我在同一个 nemspace 中有一个表单,我计划Class1在 C# winform 的 page_load 事件上实例化并使用它的对象。

在我的 VB6 项目中,我想显示我在 C#.net dll 中的表单。我用这个代码调用它 -

Private Declare Sub DislayMessage Lib "TestDll.dll" ()

Private Sub Command1_Click() //On button click event of the VB6 windows form
DislayMessage
End Sub
Run Code Online (Sandbox Code Playgroud)

我收到错误消息 - “在 TestDll.dll 的 DisplayMessage 中找不到 DLL 入口点”

我不知道如何解决这个错误。我什至怀疑这是否是应该从 VB6.0 Windows 应用程序调用包含一些 winform 的 C#.net dll 的方式。

我应该Class1在我的 VB6 代码中实例化吗?如何解决此错误?我的方法正确吗?有没有更好的方法来做到这一点?

TIA。

C-P*_*uru 5

你必须让你的类 COM-Visible。以下是我将如何更改您的代码:

namespace TestDll
{
    [Guid("FB8AB9B9-6986-4130-BD74-4439776D1A3D")]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    [ComVisible(true)]
    public interface IClass1
    {
        [DispId(50)]
        void DisplayMessage();
    }


   [Guid("74201338-6927-421d-A095-3BE4FD1EF0B4")]
   [ClassInterface(ClassInterfaceType.None)]
   [ComVisible(true)]
   [ProgId("TestDll.Class1")]
    public class Class1:IClass1
    {              
        void IClass1.DisplayMessage()
        { 
            MessageBox.Show ("Displyaing message");
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

请注意[DispId(50)]. 您想为 COM 可见的方法、属性和事件指定调度 ID。如果你不这样做,编译器会为你做这件事,你可能会在每次编译时破坏兼容性。这个数字并不重要,因为它在编译之间不会改变。

您可能想查看在 C# 中构建 COM 对象。这是一个非常好的入门教程。

一些亮点:

将 VC# 对象暴露给 COM 世界需要以下内容……

* The class must be public
* Properties, methods, and events must be public.
* Properties and methods must be declared on the class interface.
* Events must be declared in the event interface.
Run Code Online (Sandbox Code Playgroud)

每个接口都需要在接口名称之前设置一个 GUID 属性。要生成唯一的 Guid ,请使用 guidgen.exe 实用程序并选择注册表格式。

  • @menssana我认为你应该问这个问题而不是在评论中。更有可能得到回应。 (2认同)