是否可以从非托管C ++代码调用CLR DLL(例如,一个用C#编写)?
我需要一个无法以某种方式调用它的DLL,甚至可能通过一些使用C ++ / CLI构建的代理C ++进程?
答案 0 :(得分:6)
必须将CLR DLL构建为COM可见程序集。 如果您控制了C#,那么这是一个简单的重建,否则,几乎不可能直接使用它。
答案 1 :(得分:5)
::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