首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从非托管代码调用托管代码?

如何从非托管代码调用托管代码?
EN

Stack Overflow用户
提问于 2008-10-22 11:09:34
回答 6查看 33.3K关注 0票数 20

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2008-10-22 11:27:17

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

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

票数 6
EN

Stack Overflow用户

发布于 2011-07-23 04:09:12

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

示例:

C#代码

代码语言:javascript
复制
class Test
{
     [DllExport("add", CallingConvention = CallingConvention.StdCall)]
     public static int Add(int left, int right)
     {
         return left + right;
     } 
}

C代码:

代码语言:javascript
复制
 extern "C" int add(int, int);

 int main()
 {
      int z = add(5,10);
      printf("The solution is found!!! Z is %i",z);
      return 0;
 }

输出:

代码语言:javascript
复制
The solution is found!!! Z is 15

更新:在评论中有一个问题和一个很好的答案:

如何在非托管项目中包含dll?

您必须链接到编译C#代码时生成的.lib文件(https://msdn.microsoft.com/en-us/library/ba1z7822.aspx?f=255&MSPPError=-2147217396)

票数 22
EN

Stack Overflow用户

发布于 2008-10-22 11:44:33

看看GCHandle类和gcroot关键字,它为GCHandle提供了一个类型安全、模板化的包装器。

可以使用它们在本机代码中保存对CLR对象(或装箱的值)的引用。

MSDN有一个基本的教程here

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/225277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档