Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在VisualStudio中添加VB6引用会给出;类型库导入程序在类型验证期间遇到错误“;_C#_Vb.net_Visual Studio 2010_Vb6_Tlbimp - Fatal编程技术网

C# 在VisualStudio中添加VB6引用会给出;类型库导入程序在类型验证期间遇到错误“;

C# 在VisualStudio中添加VB6引用会给出;类型库导入程序在类型验证期间遇到错误“;,c#,vb.net,visual-studio-2010,vb6,tlbimp,C#,Vb.net,Visual Studio 2010,Vb6,Tlbimp,我正在将一个用VB6编写的相当大的项目转换为C#。考虑到项目的规模,项目将在18个月内分阶段完成。在将VB6 ActiveX dll的引用添加到.Net项目时,我遇到了一个问题 如果您完全遵循这些步骤,您也应该能够重新创建问题 我在.Net中编写了一个COM可见的接口: 公共接口ITestInterface 属性作为字符串 函数TestMethod()作为字符串 端接口 通过在项目属性的“编译”选项卡中选择“注册COM互操作”,您将获得一个TLB文件 我创建了一个引用此TLB的VB6项目和一

我正在将一个用VB6编写的相当大的项目转换为C#。考虑到项目的规模,项目将在18个月内分阶段完成。在将VB6 ActiveX dll的引用添加到.Net项目时,我遇到了一个问题

如果您完全遵循这些步骤,您也应该能够重新创建问题

我在.Net中编写了一个COM可见的接口:


公共接口ITestInterface
属性作为字符串
函数TestMethod()作为字符串
端接口
通过在项目属性的“编译”选项卡中选择“注册COM互操作”,您将获得一个TLB文件

我创建了一个引用此TLB的VB6项目和一个实现公开接口的类

实现ITestInterface
私有mA作为字符串
公共属性获取ITestInterface_A()作为字符串
ITestInterface_A=mA
端属性
公共属性让ITestInterface_A(ByVal值作为字符串)
mA=值
端属性
公共函数ITestInterface_TestMethod()作为字符串
ITestInterface_TestMethod=“来自VB6”
端函数
如果我在VB6中将项目属性的组件选项卡设置为使用“远程服务器文件”,则编译时会自动创建TLB。我可以在OleView中查看该TLB并查看以下内容(除了在.Net项目中定义的接口的VB6中完成的具体实现的详细信息):

//类型库文件名:TestVB6Interface.dll
[
uuid(**EF005573-BFC7-436D-A382-F906CA09F94A**),
版本(3.0)
]
// ... 一些其他的东西
//TLib://TLib:{79EC733A-0267-4506-8D38-C4D4655E0755}
importlib(“simpledtnetlibrary.tlb”);
现在,我创建了一个全新的.Net项目。如果添加对VB6 dll的引用,则会出现以下错误:

无法解析COM引用“ef005573-bfc7-436d-a382-f906ca09f94a”版本3.0。类型库导入程序在类型验证期间遇到错误。尝试在没有类成员的情况下导入

但是,如果启动Visual Studio命令提示符并运行以下命令:

tlbimp TestVB6Interface.tlb/out:TestVB6Interface.MyInterop.dll
然后,我可以将该dll作为引用添加到我的.Net解决方案中,它工作得非常好

我的问题。当我直接添加引用时,tlbimp在命令行上做了哪些没有做的事情?当VisualStudio中的消息说“尝试在没有类成员的情况下导入”时,我在VisualStudio中如何具体执行该操作?我知道如何在tlbimp中做到这一点


很抱歉出现了文字障碍,但我想尽我所能描述这种情况,保留我认为相关的信息。

在为COM互操作注册DLL时,Visual Studio IDE肯定会采用与从命令提示符运行命令行工具时不同的路径


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

你有没有弄明白这一点?我们有(有点)。实现.Net接口的VB6类需要设置为“Attribute VB_Exposed=False”,这意味着它不在TLB中或在VB6 DLL外部公开,但仍然可以通过COM公开的方法来传递.Net接口(这就是我们真正需要的)。这修复了症状(错误消失了!),但肯定没有修复我问题中提到的根本问题,因为这个解决方案可能不适用于所有人。公平地说,出于纯粹的好奇而提问,谢谢你的回答!你确定这是最好的方法吗?我建议您评估activeX在vb6上的功能,并在vb.net上搜索最佳方式。在这个示例中,您可以发现在vb.net中包含了该函数。我讨厌移植,大多数时候重写它会更快,确实如此。如果出现任何警告,它将不会导入TLB。Tlbimp.exe在控制台上显示的警告类型,通常可以忽略,因为它们是良性的。给予或接受。