我有一个VB6项目(Windows应用程序),我不得不在C#.net现有的VB6项目中重新开发一个模块。
我在C#.net开发的模块应该是一个DLL,并应包含一些Windows窗体。 我能够成功地从我的VB6项目调用AC#控制台应用程序的DLL,但我面临的问题,当我尝试从我的VB6项目调用Winforms的C#类库。
这就是我为我的概念certificate所做的 – 这是我的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窗口应用程序调用。
我应该在VB6代码中实例化Class1
吗? 我该如何解决这个错误? 我的方法是否正确? 有没有更好的方法来做到这一点?
TIA。
你必须让你的课程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。 如果你不这样做,编译器会为你做,而且你可能会在每次编译时都破坏兼容性。 编号并不重要,因为它在编译之间不会改变。
你可能想看看在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.
每个接口都需要在接口名称之前设置一个GUID属性。 要生成唯一的Guid,请使用guidgen.exe实用程序并选择注册表格式。
唯一的方法是将C#类作为COM对象(也称为CCW-COM Callable Wrapper)公开,并在VB6代码中创建该COM对象的一个实例。
这应该帮助你开始:
msdn在这里有一些很好的帮助: