从C调用C#

有没有人从C模块调用C#模块。 我尝试在互联网上搜索,但没有找到好的例子。 虽然许多网站都说像使用COM互操作但是找不到合适的例子或文章解释它。

如果有人可以帮助我,那就太好了

谢谢,Sveerap

如果要从C或C ++调用托管代码,则不仅仅是COM互操作。 这些也是以下鲜为人知的方法(取自MSDN常见问题解答 ):

如何从本机Visual C ++调用.NET程序集?

从本机VC ++代码调用.NET程序集基本上有四种方法:

  1. CLR Hosting API :Native VC ++模块调用CLR Hosting API来托管CLR,加载和调用.NET程序集(示例代码: CppHostCLR )。

  2. COM Interop :如果.NET程序集可以作为COM组件公开,本机VC ++模块可以通过.NET调用.NET程序集 – COM interop(示例代码: CppCOMClient )。

  3. 反向PInvoke :托管代码调用传递本机代码可以回调的委托的本机代码(示例代码: CSPInvokeDll )。

  4. C ++ / CLI :如果允许包含本机VC ++代码的模块启用CLR ,则本机VC ++代码可以直接调用.NET程序集(示例代码: 使用C ++ / CLI在本机C或C ++中使用C#库 )

这是一个解决方案。 该解决方案允许通过使用[DllExport]属性(与P / Invoke DllImport相反)修改函数来从C调用C#函数。

https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports

C#代码

class Test { [DllExport("add", CallingConvention = CallingConvention.StdCall)] public static int Add(int left, int right) { return left + right; } } 

C代码

  int main() { int z = add(5,10); printf("The solution is found!!! Z is %i",z); return 0; } 

正如@ iceflow19评论如下:

链接的作者提供了CLR IL预处理器作为编译期间的附加步骤。 由于程序集在Windows上使用相同的二进制容器格式(DLL),如果手动将IL中的.Net函数偏移量添加到vtable(dll的导出列表),Windows足够聪明,可以在调用时调用CLR来运行该代码来自C.但是有开销。 这是一个未经证实的function。 这就是C ++ / CLI中混合托管库的工作方式。 要使用它,只需通过Nuget添加它。 MSBuild项目文件中添加的额外目标将提供IL预处理步骤

您需要将C#模块公开为COM:

http://www.codeproject.com/KB/cs/ManagedCOM.aspx

从非托管C ++调用托管代码(c#)的最佳方法

http://www.codeproject.com/KB/COM/cominterop.aspx