如何在.NET中使用来自VB6 dll的方法?

7
我是一位有用的助手,可以将文本翻译成中文。
我有一个ActiveX VB6 DLL(无法访问其源代码),想要调用'GetUnitInfo'方法。
我通常会这样导入它:
[DllImport(@"C:\Users\R\Documents\lab.dll")]
public static extern long GetUnitInfo(String strRequest, String strInfo, String strName);

但是我遇到了一个异常:

无法在 DLL 中找到名为“GetUnitInfo”的入口点

此外,我已经尝试加载它:
Assembly myAssembly ;
myAssembly = Assembly.LoadFile("C:\\Users\\R\\Documents\\lab.dll");

但是出现了异常:
模块应该包含一个程序集清单。(HRESULT 异常: 0x80131018)
我已经尝试过清理解决方案,关闭项目选项中的清单,创建新的清单文件,但都没有帮助...

7
这是一个 VB.NET 还是 VB6 的 DLL?如果是 VB.NET 的 DLL,您只需在“解决方案资源管理器”中右键单击项目,然后按“添加引用...”并定位 DLL 即可。只有当您想要调用 本地 DLL 中的函数(例如使用 C、C++ 或 VB6 编译的 DLL)时才会使用 DllImport - Visual Vincent
2
如果它是一个VB.Net的dll,他就不会收到关于缺少清单的错误。 - Joel Coehoorn
2
如果它是一个VB6 dll,那么就没有入口点,因为VB6生成ActiveX dlls。(在VB6中可以生成具有导出函数的本地dlls,但这需要编写奇怪的代码并拦截对链接器“link.exe”的调用。) - GSerg
1
很遗憾,我从未在.NET中使用过VB6 DLL,所以我没有更多的建议了...你用什么程序反编译它的?如果它是一个.NET DLL,那么可以使用ILSpy进行反编译。 - Visual Vincent
1
如果它是VB经典dll,则应该能够将其添加为COM引用并使用内置的COM互操作机制来处理它。(它起源于经典VB的好处是它几乎肯定没有执行任何内置互操作机制无法处理的有趣技巧...) - Craig
显示剩余3条评论
1个回答

9

找到了解决方案,或许其他人也会发现这个有用(在我的情况下有效):

  1. 创建VB6 ActiveX dll的.NET包装器

    1.1 以管理员身份运行CMD

    1.2 移动到.NET SDK文件夹 - cd C:\Program Files\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\(在我的情况下)。

    1.3 运行- TlbImp.exe C:\path_to_old.dll /out: new.dll

  2. 注册ActiveX dll

2.1 以管理员身份运行CMD

2.2 运行- regsvr32.exe C:\path_to_old.dll

  1. 在c#项目中添加转换后的dll("new.dll")的引用

我曾在注册“old.dll”之前添加“new.dll”引用,在此过程中遇到了以下异常

检索具有CLSID {F2D4F4E5-EEA1-46FF-A83B-A270C92DAE4B} 的组件的COM类工厂失败,由于出现以下错误:80040154类未注册(来自HRESULT的异常:0x80040154(REGDB_E_CLASSNOTREG))

清空解决方案,删除引用并按照步骤2,3操作

你也可以找到这些文章有用:

C-Sharp-and-activex-dll

Error adding reference to dll: Solution tlbimp.exe


1
FYI,tlbimp 并不是将代码转换为 .NET,它只是创建了一个 .NET 互操作包装器,用于处理在您的 .NET 代码和参考中的 COM 代码之间移动的细节。当您调用旧的 dll 时,最终仍然会执行该 dll 中的代码。 - Craig
它不是转换,而是创建一个包装器。您可以使用包装器,或者只需使用“dynamic”和“Activator.CreateInstance”。唯一需要的步骤是注册dll。 - GSerg
@Craig,GSerg 是的,对不起,是我的错。 - Little Fox
1
很棒的答案!这对于未来的重复问题非常完美!顺便提一下,在部署/安装时,目标计算机上必须包含并注册 VB6 DLL(我想是这样的吧?)。 - Visual Vincent
1
这里描述了一种更加集成的执行相同操作的方法:https://dev59.com/_XRB5IYBdhLWcg3wZmdz#635871 - StayOnTarget

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接