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

时间:2009-12-17 09:35:16

标签: c# windows dll vb6 interop

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

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

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

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


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

    }
}

我在同一个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

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

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

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

TIA。

3 个答案:

答案 0 :(得分:4)

你必须使你的班级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");
        }

    }
}

请注意[DispId(50)]。您希望为COM可见方法,属性和事件指定调度ID。如果不这样做,编译器将为您执行此操作,并且每次编译时最终可能会破坏兼容性。这个数字并不重要,因为它不会在编译之间发生变化。

您可能想查看Building COM Objects in C#。这是一个非常好的入门教程。

一些亮点:

  

将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.
     

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

答案 1 :(得分:2)

唯一的方法是将C#类作为COM对象(也称为CCW - COM Callable Wrapper)公开,并在VB6代码中创建该COM对象的实例。

这可以帮助您入门:

http://www.bing.com/search?q=C%23+CCW&go=&form=QBRE&qs=n

答案 2 :(得分:0)

这里有一些关于msdn的优秀帮助:

http://msdn.microsoft.com/en-us/library/6bw51z5z.aspx