我正在将用VB6编写的一个相当大的项目收敛到C#中。鉴于正在移交的项目规模庞大,正在18个月内分阶段进行。我遇到了将VB6 ActiveX dll的引用添加到.Net项目的问题。在Visual Studio中添加VB6引用给出“类型库导入器在类型验证期间遇到错误”
如果您严格遵循这些步骤,您也应该能够重新创建问题。
我已经写在.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中使用“远程服务器文件”,然后在编译时,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");
现在,我创建了一个全新的。网络项目。如果我增加了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中做到这一点。
我对文本的墙壁表示歉意,但我想描述最好的情况,我可以保留我认为相关的信息。
你有没有想过这个? – JMK
我们做了(有点)。实现.Net接口的VB6类需要设置为“属性VB_Exposed = False”这意味着它不在TLB中或暴露在VB6 DLL之外,但仍然可以通过COM公开传递的方法,期望.NET接口(而这正是我们真正需要的)。这固定了症状(错误消失!),但绝对没有解决我的问题中解决的根本问题,因为此解决方案可能不适用于所有人。 –
够公平的,出于纯粹的好奇心,谢谢你的回复!你确定, – JMK