【问题标题】:Call C# dll from unmanaged C++ app without COM从没有 COM 的非托管 C++ 应用程序调用 C# dll
【发布时间】:2011-05-26 19:46:07
【问题描述】:

有没有办法在不使用 COM 的情况下从 c++ 非托管应用程序调用 c# dll?

【问题讨论】:

标签: c# c++ dll com unmanaged


【解决方案1】:

实际上可以反汇编、修改 IL 并用导出的函数重新组装它。几年前我搞砸了,并创建了一个可以反汇编 dll 的应用程序,提供可能导出的函数列表 - 允许用户选择它们,然后重新编写 IL 并重新组装所有内容。然后,我可以直接从非托管代码调用 dll...或者从托管代码 p-invoke 到 dll(不是很实用,但很有趣)。

.net 语言本身不支持这肯定是有原因的(即使 MSIL 支持它)。我不会在生产中使用它:

死链接: http://www.csharphelp.com/2007/03/exporting-managed-code-as-unmanaged/

回程机: https://web.archive.org/web/20140213030149/http://www.csharphelp.com/2007/03/exporting-managed-code-as-unmanaged/

【讨论】:

  • 它在 C++/CLI 中受支持,当您 __declspec(dllexport) 静态 C++/CLI 函数时,它会自动创建一个将加载 CLR 的 thunk。这当然是个大技巧,不加载 CLR 就无法运行托管代码。
  • @Hans 当您将导出添加到您的 IL 时,ILASM 将执行您的程序集所需的所有操作,就像使用本机程序集一样。
【解决方案2】:

我可能有点晚了,但请查看this

使用这个 msbuild 小任务,您可以创建一个可以像本地 DLL 一样调用的 C# 库。 (例如,为需要原生 dll 的应用编写插件)

哦,别忘了使用project template,它会为您设置好一切。

【讨论】:

    【解决方案3】:

    您可以使用 Reverse P/Invoke 执行此操作 - 示例和讨论 here

    【讨论】:

    • 谢谢。这很有趣。
    【解决方案4】:

    您唯一的选择实际上是使用 C++.net 或为其创建一个 C++.net 包装器来导出您需要的内容。

    Calling C# code from C++

    【讨论】:

      猜你喜欢
      • 2010-10-03
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多