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。
你必须让你的类 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 世界需要以下内容……
Run Code Online (Sandbox Code Playgroud)* 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 实用程序并选择注册表格式。
| 归档时间: |
|
| 查看次数: |
5531 次 |
| 最近记录: |