【问题标题】:How to use method from VB6 dll in .NET?如何在 .NET 中使用来自 VB6 dll 的方法?
【发布时间】:2019-03-03 13:55:56
【问题描述】:

我有 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)

我已经尝试清理解决方案,关闭项目选项中的清单,创建新的清单文件,但它没有帮助我......

【问题讨论】:

  • 这是 VB.NET 还是 VB6 DLL?对于 VB.NET DLL,您只需右键单击 Solution Explorer 中的项目,按 Add Reference... 并找到 DLL。 DllImport 仅在您想调用 native DLL(如用 C、C++ 或 VB6 等编译的 DLL)中的函数时使用
  • 如果是 VB.Net dll,他不会收到关于缺少清单的错误。
  • 如果它是 VB6 dll,将没有入口点,因为 VB6 生成了 ActiveX dll。 (在 VB6 中可以使用导出函数生成本机 dll,但这需要编写时髦的代码并拦截对链接器的调用,link.exe。)
  • 不幸的是,我从来没有在 .NET 中使用过 VB6 DLL,所以我没有更多的建议......你在什么程序中反编译了它?如果它是一个 .NET DLL,它应该可以被 ILSpy 反编译。
  • 如果它是一个 VB 经典 dll,那么您应该能够将它添加为 COM 引用并使用内置的 COM 互操作机制来处理它。 (它起源于经典 VB 的伟大之处在于,它几乎肯定不会做任何内置互操作机制不知道如何处理的有趣技巧......)

标签: c# vb.net vb6 dllimport


【解决方案1】:

找到解决方案,其他人会觉得有用,(这在我的情况下有效):

  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

  3. 在 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

【讨论】:

  • 仅供参考,tlbimp 本身并没有转换为 .NET,它只是创建了一个 .NET 互操作包装器,用于处理在 .NET 代码和参考中的 COM 代码之间移动的细节。当您调用旧 dll 时,您最终仍将执行该 dll 中的代码。
  • 它不会转换,它会创建一个包装器。您可以使用包装器,也可以只使用dynamicActivator.CreateInstance。唯一需要的步骤是注册 dll。
  • @Craig,GSerg 是的,对不起,我的错。
  • 很好的答案!这非常适合未来的重复!顺便提一下,VB6 DLL 必须包含(我认为?)并在部署/安装时在目标计算机上注册。
  • 这里描述了一种更综合的方法来做同样的事情:stackoverflow.com/a/635871/3195477
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 2011-07-17
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
相关资源
最近更新 更多