要从C#调用C API,我会使用P / Invoke。但是,如果我要反过来,从C调用.NET API,我该怎么做呢?
答案 0 :(得分:2)
如果您真的希望通过C API完成所有操作并在COM和C ++上运行,那么您可以执行以下操作。但首先要弄清楚它是否真的有必要!我怀疑在大多数情况下它不会。
步骤1.创建您要呼叫的C#.Net程序集。
步骤2.创建一个混合模式CLI / C ++程序集,并导出extern“C”函数。让这个程序集调用C $程序集。
步骤3.创建C应用程序,该应用程序从步骤2中创建的DLL调用导出的C样式函数。
要考虑的事情。 A.是否有实际需要让C(与C ++ / COM)应用程序直接调用.Net程序集? 换句话说,如果你真的必须有一个混合(.Net和非.Net)应用程序/系统,为什么不使用C ++和COM来COM导出.Net方法?
B中。您编写的API是否是类的包装器?如果是这样,你将如何管理他们的生命时间? (例如,你会创建/使用句柄吗?你将如何管理他们与实际gc对象的关系......等等)
℃。字符串。这些在C和.Net之间处理非常不同。确保你熟悉他们之间的差异以及如何在这些边界之间正确发送字符串......提示:CString是你的朋友。
答案 1 :(得分:1)
有一种解决方案可以避免使用COM或C ++ \ CLI。见这里:Calling A .NET Managed Method from Native Code
答案 2 :(得分:0)
您可以将c#代码转换为COM,或使用C ++ \ CLI。
答案 3 :(得分:0)
这是一个解决方案。它实现了[DllExport]属性 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;
}