【问题标题】:How to make a dll access managed code, but expose functions to unmanaged binary如何使 dll 访问托管代码,但将函数公开给非托管二进制文件
【发布时间】:2012-09-03 17:10:17
【问题描述】:

这就是我的情况:我正在使用一个用非托管 c++ 编写的二进制文件,它允许用户指定一个 .dll 来自定义功能; c++ 应用程序将调用 dll 中的某些函数。在这种情况下,dll 将依赖于第三方的 .NET .dll 中打包的功能(我无法控制它)。我的任务是编写 c++ 应用程序使用的 dll。我更喜欢使用 c++,但如果它更有意义,我可以使用 c#。我怎样才能完成我想做的事情?我已经用有限的成功搜索了这个问题。请注意,这是我使用托管/非托管代码的极少数情况之一,因此我的知识有些欠缺。

【问题讨论】:

  • 它绝对取决于 .NET dll - 如果它是 COM 可见的,您可以在 C++ 中编写一个非托管(=native)包装器。如果它不是 COM 可见的,那么它会变得更加复杂,因为那时您可能需要编写 2 个包装器:一个托管包装器通过 COM 公开它,以及一个用于托管包装器的本机包装器......
  • 由于我的经验不足,我可能无法区分。我将 .NET dll 加载到依赖项walker 中,但没有看到任何列出的导出函数;我认为这意味着它不是 COM 可见的。如果是这样,是否有一种自动方法可以为 .NET 二进制文件生成 COM 可见的包装器?还是必须手写?
  • 如果你不能改变两端,你几乎没有选择。您需要专注于首先加载 CLR,以便执行托管代码。通过谷歌搜索 CorBindToRuntimeEx、CLRCreateInstance for .NET 4 及更高版本开始这一旅程。

标签: c# c++ .net clr managed


【解决方案1】:

您可以使用/crl 选项编译您的c++ dll。它的导出通常对本机 c++ 应用程序可见。此外,它还可以使用 Assembly::LoadFrom 例程加载带有 .NET 程序集的 dll。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    相关资源
    最近更新 更多