【问题标题】:Possible to call a managed DLL from unmanaged C++?可以从非托管 C++ 调用托管 DLL 吗?
【发布时间】:2011-03-04 12:35:54
【问题描述】:

是否可以从非托管 C++ 代码调用 CLR DLL(例如用 C# 制作的)?

我需要一个无法以某种方式调用的 DLL,甚至可能通过一些使用 C++/CLI 构建的代理 C++ 进程?

【问题讨论】:

  • 您可以将该托管 dll 包装到一个可执行文件中,该可执行文件是一个控制台应用程序并接受命令行参数,同时将其结果输出到 stdout。然后,您可以像调用任何其他 exe 一样调用它。不理想,但可能有效。我希望你没有使用多个线程,因为我不知道这是否会起作用。
  • 你自己给出了答案。用 C++/CLI(或 C++.Net 或托管 C++ 或今天的调用方式)编写代理,然后从非托管 C++ 代码中调用此代理。

标签: .net c++ interop


【解决方案1】:

CLR DLL 必须构建为 COM 可见程序集。 如果你有 C# 的控制权,它是一个简单的重建,否则几乎不可能直接使用它。

【讨论】:

  • 添加了“...直接使用它。”否则意思是错误的,对不起。
  • @SWeko:总是有反向 PInvoke。所以这不是不可能的。
  • AFAIK,要使用反向 PInvoke,您仍然需要访问 C# 代码来设置委托和调用约定(从未使用过,所以我不能从经验中说)
【解决方案2】:

@SWeko 如果您可以修改原始 DLL 并且您的非托管代码可以依赖访问 COM 单元(调用 ::CoInitialize() 的自己的线程或非托管代码的调用线程具有一致的公寓)。

如果不是这种情况,那么最好的解决方案是创建一个“托管”C++ DLL 作为托管 C# 程序集的包装器。它被称为 C++/CLI。您可以公开非托管 C API 操作,并在这些操作的实现内部,委托给托管 API。它工作得很好,与调用 COM API 不同,没有线程关联问题。

【讨论】:

    【解决方案3】:

    我不确定它是否合适,但也许“反向 PInvoke”是一个选项。

    如果您可以首先从您的 C# 调用您的 C++,那么您可以向 C++ 提供一个 .net 委托,它可以用作函数指针。然后,您可以使用该函数指针从 C++ 调用 C#。

    public delegate int Read(int target);
    [DllImport("yourC++.dll")]
    static extern void RegisterRead(Read x);
    Read m_Read = new Read(yourClass.Read);
    
    RegisterRead(m_Read);
    

    GC 早期收集委托可能有一些技巧,如果在RegisterRead 中不立即使用委托,则可能需要固定具有委托的任何类

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-22
      • 2013-01-07
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      相关资源
      最近更新 更多