是否有人致力于从C模块调用C#模块。我尝试在互联网上搜索,但没有找到好的例子。虽然许多网站都说像使用COM互操作但是找不到合适的例子或文章解释它。
如果有人可以帮助我,那就太棒了
谢谢, Sveerap
答案 0 :(得分:24)
如果要从C或C ++调用托管代码,则不仅仅是COM互操作。这些也是以下鲜为人知的方法(取自 MSDN FAQ ):
如何从本机Visual C ++调用.NET程序集?
基本上有四种方法 从本机VC ++代码调用.NET程序集:
CLR托管API :本机VC ++模块调用CLR Hosting APIs来托管CLR,加载并调用.NET程序集(示例代码:CppHostCLR)。
COM Interop :如果.NET程序集可以作为COM组件公开,本机VC ++模块可以通过.NET调用.NET程序集 - COM interop(示例代码:{ {3}})。
反向PInvoke :托管代码调用本机代码,传递本机代码可以回调的代理(示例代码:CppCOMClient)。
- 醇>
C ++ / CLI :如果允许包含本机VC ++代码的模块CSPInvokeDll,则本机VC ++代码可以调用 直接.NET程序集(示例代码:enable CLR)
答案 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)
您可以将C#模块公开为COM:
http://www.codeproject.com/KB/cs/ManagedCOM.aspx
答案 3 :(得分:0)