可以从非托管C ++调用托管DLL吗?

时间:2010-06-16 14:56:49

标签: .net c++ interop

是否可以从非托管C ++代码调用CLR DLL(例如,一个用C#编写)?

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

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:5)

如果您可以修改原始DLL并且您的非托管代码可以依赖于访问COM公寓(其自己的调用::CoInitialize()的线程或非托管代码的调用线程),那么@SWeko会给您最好的答案有一致的公寓。)

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

答案 2 :(得分:4)

我不确定它是否合适,但也许“反向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