有人尝试过从C模块调用C#模块吗?我在互联网上搜索了一下,但没有找到好的例子。虽然很多网站说可以使用COM互操作性,但是没有找到一个恰当的例子或文章来解释它。
如果有人能帮忙解决这个问题,那就太好了。
谢谢, Sveerap
如果你想从C或C++调用托管代码,不仅仅局限于COM互操作。还有以下一些较少人知的方法(源自MSDN FAQ):
.NET程序集直接调用(示例代码:使用C++/CLI在本地C或C++中调用C#库)如何在本机Visual C++中调用.NET程序集?
基本上有四种方法可以实现在本机VC++代码中调用.NET程序集:
CLR托管API:本机VC++模块通过调用CLR托管APIs来托管CLR、加载和调用.NET程序集(示例代码:CppHostCLR)。
COM互操作:如果.NET程序集可以作为COM组件公开,本机VC++模块可以通过.NET-COM互操作调用.NET程序集(示例代码:CppCOMClient)。
反向PInvoke:托管代码调用本机代码时,传递一个委托,本机代码可以回调该委托(示例代码:CSPInvokeDll)。
C++/CLI:如果包含本机VC++代码的模块允许启用CLR,本机VC++代码可以调用包含托管代码的.NET程序集。
以下是解决方案。该解决方案允许在一个 C# 函数上使用 [DllExport] 属性,从而可以通过 C 调用该函数(与 P/Invoke DllImport 相反)。
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;
}
如下评论所述:
该链接的作者在编译过程中提供了一个CLR IL预处理器作为附加步骤。由于装配件在Windows上使用相同的二进制容器格式(DLL),如果您手动将.Net函数偏移量添加到IL中的vtable(dll的导出列表)中,则Windows聪明地调用CLR来运行从C中调用的代码。但是,这会带来开销。这是一个未经宣传的功能。这就是C++/CLI中混合托管库的工作原理。要使用它,请通过Nuget添加它。您的MSBuild项目文件中添加的额外目标将提供IL预处理步骤。
LoadLibrary
FreeLibrary
等吗? - westonUnmanagedExports
库而不是核心库代码。 - Lyndon Gingerich