代码之家  ›  专栏  ›  技术社区  ›  David

从.NET实例化非托管类

  •  3
  • David  · 技术社区  · 14 年前

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

    我目前正在修补一个旧的遗留应用程序(我还不相信我们能用它做任何事情,但我必须进行修补和研究),公司希望迁移到.NET。这似乎是以前尝试过的,我现在正在研究。最常见的编译错误是对项目不理解的旧DLL的引用。

    其中一行代码的示例如下:

    Dim cAccounts As HSVMETADATALib.HsvAccounts
    

    项目中有一个对库的引用被破坏,我相信这是向导驱动的尝试的结果,该尝试只是将某个.NET之前的项目移植到.NET。我有它正在查找的DLL,但是添加对它的引用会返回错误:

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

    没有什么 关于这个DLL。我有 非常

    (请注意,在这种情况下,我们甚至不知道是否有正确的源代码,没有文档,也不知道此应用程序的所有权和维护是如何持久的。但是,从外部DLL实例化对象(这些DLL来自一些未知的、目前可能无法访问的第三方源代码)的这一障碍将减少大多数编译器错误,并帮助我们深入了解更多的代码,甚至可能得到至少可编译的精简版本。)

    很模糊,但值得一问:)

    3 回复  |  直到 14 年前
        1
  •  3
  •   Robert Harvey    14 年前

    我建议你试着用 Dependency Walker . 这将为您提供有关DLL内部和API的更多信息。

    另请参见:

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

        2
  •  1
  •   Darin Dimitrov    14 年前

    您需要尝试查找有关此DLL的更多信息。例如,如果它是一个COM对象,您可以生成一个强类型的托管包装器,它将允许您使用 tlbimp.exe PInvoke dumpbin.exe 查看导出函数名的列表。

        3
  •  0
  •   Beth    14 年前

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

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