从C调用C#

sve*_*rap 25 c c#

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

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

谢谢,Sveerap

Dir*_*mar 24

如果要从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#库)


Maj*_*cRa 19

这是一个解决方案.该解决方案允许通过使用[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;
     } 
}
Run Code Online (Sandbox Code Playgroud)

C代码

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

正如@ iceflow19评论如下:

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

  • 我读了那个链接,但他没有真正的使用它的例子.在c项目中你需要做什么才能加载c#(dll?)代码?你需要`LoadLibrary``FreeLibrary`等. (5认同)