从.NET实例化非托管类

时间:2010-08-19 16:43:11

标签: .net dll unmanaged

我在Google上找到了很多关于如何在.NET代码中调用非托管DLL中的API函数的示例,但是如何从该非托管代码中实例化对象呢?

我目前正在修补一个旧的遗留应用程序(我还不相信我们将能够做任何事情,但我必须修补和研究)该公司希望迁移到。净。看来这是之前的尝试,现在我正在仔细研究。最常见的编译错误是对项目不理解的旧DLL的引用。

此处的一行代码示例如下:

Dim cAccounts As HSVMETADATALib.HsvAccounts

项目中的库有一个破坏的引用,我认为这是一些向导驱动的尝试将一些预.NET项目移植到.NET的结果。我有它正在寻找的DLL,但添加一个引用它会返回错误:

  

无法添加对'HFMConstants.dll'的引用。请确保该文件是可访问的,并且它是有效的程序集或COM组件。

现在,我知道没有关于这个DLL。我在.NET之前的Windows编程方面有很少的经验。所以我一直在网上查看有关在此代码中使用旧DLL的信息,它们都专注于调用DLL中的API函数。但是,仔细研究这段代码,它不仅仅关于API函数,还有关于对象的更多信息。那么我将如何实例化其中一个对象的实例呢?

(请注意,这是我们甚至不知道我们是否拥有正确的源代码,没有文档的情况之一,此应用程序的所有权和维护的任何内容都没有建立到最后。但这一个障碍能够从外部DLL实例化对象,这些对象来自某些未知且在此时可能无法访问的第三方源,将减少大多数编译器错误,并帮助我们进入更多的代码,甚至可能得到一个精简版至少可以编译。)

这很模糊,但值得问一下:)

3 个答案:

答案 0 :(得分:3)

我建议您尝试使用Dependency Walker打开DLL。这应该为您提供有关DLL的内部和API的更多信息。

另见:

引用非CLR DLL
http://illuminatedcomputing.com/blog/?p=44

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您可以注释掉所有未编译的代码,任何依赖于您没有的文件。

如果您拥有.dll及其所有依赖的.dll,您应该能够将其添加到项目引用中。如果没有,没有外部文档,很难弄清楚编译代码的作用。