我有一个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。
答案 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对象的实例。
这可以帮助您入门:
答案 2 :(得分:0)
这里有一些关于msdn的优秀帮助: