Dir*_*mar 24
如果要从C或C++调用托管代码,则不仅仅是COM互操作.这些也是以下鲜为人知的方法(取自 MSDN常见问题解答):
如何从本机Visual C++调用.NET程序集?
从本机VC++代码调用.NET程序集基本上有四种方法:
CLR Hosting API:Native VC++模块调用CLR Hosting API来托管CLR,加载和调用.NET程序集(示例代码:CppHostCLR).
COM Interop:如果.NET程序集可以作为COM组件公开,则本机VC++模块可以通过.NET调用.NET程序集 - COM interop(示例代码:CppCOMClient).
反向PInvoke:托管代码调用传递本机代码可以回调的委托的本机代码(示例代码:CSPInvokeDll).
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预处理步骤