我正在将用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文件。
我创建了一个引用此TLB的VB6项目和一个实现暴露接口的类。
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中将项目属性的Component选项卡设置为使用“Remote Server Files”,则在编译时会自动创建TLB。我可以在OleView中查看TLB并查看以下内容(除了在.Net项目中定义的接口的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
然后我可以在我的.Net解决方案中添加该dll作为参考,它完全正常。
我的问题。当我直接添加引用时,tlbimp在命令行上执行的操作是什么?当Visual Studio中的消息说“尝试导入没有类成员”时,我在Visual Studio中是如何做到的?我知道如何在tlbimp中做到这一点。
我为文字墙道歉,但我想尽可能地描述情况,以便保持我认为相关的信息。
答案 0 :(得分:2)
在为COM Interop注册DLL时,Visual Studio IDE肯定采用不同的路径,然后在从命令提示符运行命令行工具时执行。
我怀疑微软是否在任何地方记录过这一点。然而,我多年的经验证明了这一点。我曾遇到一种情况,其中包括&#34; regsvcs&#34;来自.NET 2.0 Framework的命令实际上会导致无限循环。如果你谷歌它,你可能会发现其他人有这个问题。通过使用VS IDE执行.NET服务组件的COM注册,我能够更进一步。但是,它不可避免地以错误结束。错误是在无限循环上向前迈出的一步。无论哪种方式,它都证明了VS IDE在处理COM Interop和注册表项时采用了不同的代码路径/业务逻辑。