2010-08-19 174 views
3

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

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

在这一行代码的一个例子是:

Dim cAccounts As HSVMETADATALib.HsvAccounts 

有一个损坏的引用在项目库中,我相信这是一些向导驱动的尝试的结果,只是口一定预.NET项目到.NET。我有它寻找DLL,但添加到它的引用返回错误:

A reference to 'HFMConstants.dll' could nto be added. Please make sure that the file is accessible, and that it is a valid assembly or COM component.

现在,我知道什么这个DLL。而且我有很多很有 pre.NET Windows编程的经验。因此,我一直在网上寻找有关在此代码中使用旧DLL的信息,并且都侧重于调用DLL中的API函数。但是,仔细查看这些代码,关于API函数和更多关于对象的内容就更少了。那么我将如何去实例化这些对象之一的实例呢?

(请注意,这是其中一种情况,我们甚至不知道我们是否有正确的源代码,没有文档,没有任何关于此应用程序的所有权和维护的内容,能够实例化来自外部DLL的对象的障碍是来自某些未知且可能无法访问的第三方来源,它将减少大部分编译器错误并帮助我们进入更多的代码,即使获得至少一个编译精简版。)

这是模糊的,但它是值得一问:)

回答

3

我建议你试试用Dependency Walker打开DLL。这应该给你更多关于DLL的内部和API的信息。

另请参见:

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

+0

我喜欢这个Dependency Walker,漂亮的小工具。当然,这一个样本DLL有一个大型的依赖关系树(其中一些没有找到,我想这将是另一个有趣的路障)。我不确定这里面的信息对于这项工作特别有用,但我现在可以放心地忽略。 – David 2010-08-19 17:02:45

1

你需要尝试找出更多informati关于这个DLL。例如,如果它是一个COM对象,你可以生成一个强类型的托管包装,它将允许你使用tlbimp.exe。如果它是一个标准的Win32库,你需要找出它是否暴露了一些函数,它们的名字和参数是为了PInvoke它们。您可以使用dumpbin.exe来查看导出的函数名称的列表。

+0

我猜这不是COM。 ActiveX可能吗?如果有的话,我不太了解它们之间的差异。 tlbimp创建了一个DLL,但它似乎不可用。 PInvoke仅用于调用方法,不是吗?我没有发现任何关于用它来实例化对象的东西。 – David 2010-08-19 17:00:17

+0

如果它是一个COM对象,'tlbimp'应该生成一个包含暴露类型的托管程序集。 – 2010-08-19 17:04:14

0

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

如果您有.dll及其所有依赖的.dll文件,您应该可以将它添加到您的项目引用。如果没有,没有外部文档,很难弄清楚编译代码在做什么。