我正在将一个相当庞大的VB6项目转换为C#。考虑到项目的规模,该过程将在18个月内分阶段进行。我遇到了一个问题,无法将VB6 ActiveX dll的引用添加到.Net项目中。
如果你按照以下步骤操作,也应该能够重现这个问题。
我已经在.Net中编写了一个COM可见的接口:
<ComVisible(True)>
Public Interface ITestInterface
Property A As String
Function TestMethod() As String
End Interface
通过在项目属性的“编译”选项卡中选择“注册COM互操作性”,您将获得一个TLB文件。
我创建了一个VB6项目,引用了这个TLB以及实现接口的类。
Implements ITestInterface
Private mA As String
Public Property Get ITestInterface_A() As String
ITestInterface_A = mA
End Property
Public Property Let ITestInterface_A(ByVal value As String)
mA = value
End Property
Public Function ITestInterface_TestMethod() As String
ITestInterface_TestMethod = "From VB6"
End Function
如果我在VB6项目属性的组件选项卡中设置使用“远程服务器文件”,则在编译时会自动创建一个TLB。我可以在OleView中查看该TLB,并查看以下内容(除了VB6中定义的接口的具体实现细节之外):
// typelib filename: TestVB6Interface.dll
[
uuid(**EF005573-BFC7-436D-A382-F906CA09F94A**),
version(3.0)
]
// ... some other stuff
// TLib : // TLib : : {79EC733A-0267-4506-8D38-C4D4655E0755}
importlib("SimpleDotNetLibrary.tlb");
现在我创建了一个全新的 .Net 项目。如果我添加对 VB6 dll 的引用,会出现以下错误:
无法解析 COM 引用“ef005573-bfc7-436d-a382-f906ca09f94a”版本 3.0。类型库导入程序在类型验证期间遇到错误。请尝试不导入类成员进行导入。
但是,如果我启动 Visual Studio 命令提示符并运行以下命令:
tlbimp TestVB6Interface.tlb /out:TestVB6Interface.MyInterop.dll
那么我可以将该dll作为引用添加到我的.Net解决方案中,它可以完美地工作。
我的问题是,tlbimp在命令行上执行的操作与直接添加引用时有什么不同?当Visual Studio中的消息显示“尝试导入没有类成员”时,我该如何在Visual Studio中实现这一点?我知道如何在tlbimp中做到这一点。
对于这篇文字墙,我感到抱歉,但我希望尽可能详细地描述情况,并保留我认为相关的信息。