【问题标题】:Instantiate Unmanaged Class From .NET从 .NET 实例化非托管类
【发布时间】:2010-08-19 16:43:10
【问题描述】:

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

我目前正在修改公司想要迁移到的旧的遗留应用程序(我还不相信我们能够对此做任何事情,但我必须进行修改和研究) 。网。看来这是以前尝试过的,我现在正在查看。最常见的编译错误是对项目不理解的旧 DLL 的引用。

其中一行代码的示例是:

Dim cAccounts As HSVMETADATALib.HsvAccounts

项目中对库的引用已损坏,我相信这是某些向导驱动的尝试将某些 pre-.NET 项目移植到 .NET 的结果。我有它正在寻找的 DLL,但添加对它的引用会返回错误:

不能添加对“HFMConstants.dll”的引用。请确保该文件是可访问的,并且它是一个有效的程序集或 COM 组件。

现在,我对这个 DLL一无所知。而且我在预 .NET Windows 编程方面的经验非常。因此,我一直在网上寻找有关在此代码中使用旧 DLL 的信息,这些信息都集中在调用 DLL 中的 API 函数上。然而,纵观这段代码,它更多的是关于对象的 API 函数。那么我将如何实例化这些对象之一的实例呢?

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

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

【问题讨论】:

    标签: .net dll unmanaged


    【解决方案1】:

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

    另见:

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

    【讨论】:

    • 我喜欢这个 Dependency Walker,不错的小工具。自然地,这个示例 DLL 有一个大的依赖关系树(其中一些没有找到,我想这将是另一个有趣的障碍)。不过,我不确定这里的哪些信息对这项工作特别有用,以及我可以安全地忽略哪些信息。
    【解决方案2】:

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

    【讨论】:

    • 我猜这不是 COM。也许是 ActiveX?如果有的话,我对区别并不十分熟悉。 tlbimp 创建了一个 DLL,但它似乎不可用。 PInvoke 只是用于调用方法,不是吗?我没有找到任何关于用它实例化对象的信息。
    • 如果是 COM 对象 tlbimp 应该生成一个包含公开类型的托管程序集。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-02-24
      • 2018-10-09
      • 1970-01-01
      • 2020-05-16
      • 2011-03-13
      • 2020-01-05
      • 1970-01-01
      • 2011-02-05
      • 1970-01-01
      相关资源
      最近更新 更多