当前位置:  开发笔记 > 编程语言 > 正文

从非托管代码调用托管代码

如何解决《从非托管代码调用托管代码》经验,为你挑选了3个好方法。

我想从非托管C++调用我的.NET代码.我的进程入口点是基于.NET的,所以我不必担心托管CLR.我知道可以使用.NET包装器来完成.NET对象,但是我想访问托管类的各个静态方法,因此COM不是我最短/最简单的路径.

谢谢!



1> MajesticRa..:

看看这个解决方案:https: //sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports 该解决方案允许通过使用[DllExport]属性(与P/Invoke DllImport相反)修饰您的函数来从C调用C#函数.

〔实施例:

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)


如何在非托管项目中包含dll?是否有某个示例项目(例如视觉工作室)?

2> Stu Mackella..:

看一下GCHandle类和gcroot关键字,它提供了一个围绕GCHandle的类型安全的模板化包装器.

您可以使用它们来保存对本机代码中CLR对象(或盒装值)的引用.

MSDN 在这里有一个基础教程.



3> Rasmus Faber..:

假设您正在讨论真正的非托管代码 - 不仅仅是在使用/ clr编译的混合模式程序集中运行的本机C++ - 最简单的方法是在C++/CLI中创建.NET代码的包装器.然后,您可以通过使用__declspec(dllexport)标记它们来导出C++/CLI方法.

或者,如果您可以控制非托管代码的调用,则可以编组.NET方法的函数指针并将它们传递给非托管代码.

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有