我想从非托管C++调用我的.NET代码。我的进程入口点是基于.NET的,所以我不必担心托管CLR。我知道这可以使用.NET对象的COM包装器来完成,但我想访问托管类的单个静态方法,所以COM不是我最短/最简单的方法。
发布于 2008-10-22 11:27:17
假设您谈论的是真正的非托管代码--而不仅仅是在用/clr编译的混合模式程序集中运行的本机C++ --最简单的方法是使用C++/CLI语言为您的.NET代码创建一个包装。然后,您只需使用__declspec(dllexport)标记它们,就可以导出C++/CLI方法。
或者,如果您可以控制非托管代码的调用,则可以封送指向.NET方法的函数指针,并将它们传递给非托管代码。
发布于 2011-07-23 04:09:12
看看这个解决方案:Invoke这个解决方案允许通过用DllExport属性修饰你的函数来从C调用C#函数(与P/ https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports DllImport相反)。
示例:
C#代码
class Test
{
[DllExport("add", CallingConvention = CallingConvention.StdCall)]
public static int Add(int left, int right)
{
return left + right;
}
}C代码:
extern "C" int add(int, int);
int main()
{
int z = add(5,10);
printf("The solution is found!!! Z is %i",z);
return 0;
}输出:
The solution is found!!! Z is 15更新:在评论中有一个问题和一个很好的答案:
如何在非托管项目中包含dll?
您必须链接到编译C#代码时生成的.lib文件(https://msdn.microsoft.com/en-us/library/ba1z7822.aspx?f=255&MSPPError=-2147217396)
发布于 2008-10-22 11:44:33
看看GCHandle类和gcroot关键字,它为GCHandle提供了一个类型安全、模板化的包装器。
可以使用它们在本机代码中保存对CLR对象(或装箱的值)的引用。
MSDN有一个基本的教程here。
https://stackoverflow.com/questions/225277
复制相似问题