从C调用C#

时间:2010-12-13 11:18:42

标签: c# c

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

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

谢谢, Sveerap

4 个答案:

答案 0 :(得分:24)

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

  

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

     

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

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

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

  4.   
  5. 反向PInvoke :托管代码调用本机代码,传递本机代码可以回调的代理(示例代码:CppCOMClient)。

  6.   
  7. C ++ / CLI :如果允许包含本机VC ++代码的模块CSPInvokeDll,则本机VC ++代码可以调用   直接.NET程序集(示例代码:enable CLR

  8.   

答案 1 :(得分:18)

这是一个解决方案。该解决方案允许通过使用[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.但是有开销。这是一个未经公布的功能。这就是C ++ / CLI中混合托管库的工作方式。要使用它,只需通过Nuget添加它。 MSBuild项目文件中添加的额外目标将提供IL预处理步骤

答案 2 :(得分:8)

答案 3 :(得分:0)

还可以选择使用CoreRT从C#代码构建本机库,然后从C调用它们。 Here是一个例子。