从.NET实例化非托管类

3
通过谷歌我找到了很多关于如何在.NET代码中调用未托管DLL中的API函数的示例,但是如何从该未托管代码实例化一个对象呢?
目前我正在尝试处理公司的旧遗留应用程序(我还没有被说服我们能够对此做任何事情,但我必须进行尝试和研究),公司想要将其迁移到.NET。看起来以前曾经尝试过,我正在浏览相关内容。最常见的编译错误是对项目不理解的旧DLL的引用。
其中一行代码的示例为:
Dim cAccounts As HSVMETADATALib.HsvAccounts

在该项目中存在对库的引用错误,我认为这是一些向导驱动的尝试将一些预先.NET项目移植到.NET的结果。我有它正在寻找的DLL文件,但添加对它的引用会返回以下错误:
“无法添加对'HFMConstants.dll'的引用。请确保文件可访问,并且它是有效的程序集或COM组件。”
现在,我对这个DLL一无所知。而且我在之前的Windows编程方面经验非常少。因此,我一直在网上寻找关于如何在此代码中使用旧DLL的信息,但所有信息都侧重于调用DLL中的API函数。然而,在查看此代码时,它与API函数的关系要小得多,更多地涉及对象。那么,我应该如何实例化其中一个对象呢?
(请注意,这是其中一种情况,我们甚至不知道我们是否拥有正确的源代码,没有文档,关于此应用程序的所有权和维护都是建立在持久性基础上的。但是,能够从外部DLL中实例化对象,这些DLL来自某个未知的、潜在的无法访问的第三方来源,将减少大部分编译器错误,并帮助我们进入代码的更多内容,可能甚至获得一个简化版本,至少可以编译。)
3个回答

3

我喜欢这个Dependency Walker,是个不错的小工具。当然,这个样本DLL有一个庞大的依赖树(其中一些没有找到,我想这将是另一个有趣的障碍)。我不确定从这里面获取哪些信息对于这个努力来说特别有用,以及我现在可以安全地忽略哪些。 - David

1

您需要尝试查找有关此DLL的更多信息。例如,如果它是COM对象,则可以生成强类型托管包装器,以便您可以使用tlbimp.exe来消耗它。如果它是标准的Win32库,则需要找出它是否公开了一些函数,它们的名称和参数,以便您可以使用PInvoke调用它们。您可以使用dumpbin.exe查看导出函数名称列表。


我猜它不是COM。也许是ActiveX?如果有区别,我并不真正了解。tlbimp创建了一个DLL,但似乎无法使用。PInvoke只是用于调用方法,对吗?我没有找到任何关于使用它实例化对象的信息。 - David
如果它是一个COM对象,tlbimp应该生成一个包含公开类型的托管程序集。 - Darin Dimitrov

0
你可以注释掉所有不能编译的代码,以及任何依赖于没有的文件的代码。
如果你有.dll文件和它所依赖的所有.dll文件,你应该可以将其添加到你的项目引用中。如果没有外部文档,很难弄清楚那个被编译的代码在做什么。

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