2012-09-23 20 views
8

我正在将用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中做到这一点。

我对文本的墙壁表示歉意,但我想描述最好的情况,我可以保留我认为相关的信息。

+0

你有没有想过这个? – JMK

+0

我们做了(有点)。实现.Net接口的VB6类需要设置为“属性VB_Exposed = False”这意味着它不在TLB中或暴露在VB6 DLL之外,但仍然可以通过COM公开传递的方法,期望.NET接口(而这正是我们真正需要的)。这固定了症状(错误消失!),但绝对没有解决我的问题中解决的根本问题,因为此解决方案可能不适用于所有人。 –

+0

够公平的,出于纯粹的好奇心,谢谢你的回复!你确定, – JMK

回答

2

当为COM Interop注册DLL时,Visual Studio IDE明确采用不同的路径,然后在从命令提示符运行命令行工具时执行此操作。

我怀疑微软是否在任何地方记录了这一点。但是,我多年的经验证明了这一点。我曾遇到过一种情况:.NET 2.0框架中的“regsvcs”命令实际上会导致无限循环。如果你谷歌它可能会发现其他人有这个问题。通过使用VS IDE执行.NET服务组件的COM注册,我能够更进一步。然而,它不可避免地以错误结束。这个错误在无限循环中向前迈进了一步。无论哪种方式,向我证明,在处理COM Interop和注册表项时,VS IDE采用不同的代码路径/业务逻辑。

+0

它的确如此。如果有任何警告,它不会导入TLB。 Tlbimp.exe在控制台上显示的警告类型,通常可能会被忽略,因为它们是良性的。给或拿。 –

相关问题