如何在.NET(C#)中使用现有的C++代码

3

我想创建一个C#项目,并实现已有的本地(C++)代码。有没有关于此方面的好教程可以推荐?

谢谢!

6个回答

4
您可以使用P/Invoke并调用非托管方法。我将为您提供一些示例: 这里是对MSDN官方文档的引用。 这里是一个社区维护的网站,其中包含大多数常见的Windows非托管库以及方法签名和示例。

3

如果你的C++代码是托管的(正如你所说),那么我建议你保持它原来的C++代码格式,除非你有很充分的理由去改变它 -- 未来的C#(等等)程序集应该可以直接引用它。


好眼力 - 我错过了那个并将其读作“现有的管理(C ++)代码”。考虑到上下文,这很可能是一个打字错误。 - Stu Mackellar
通过经验我发现检查显而易见的问题总是值得的--当然,如果只是打错了一个字母,那么很多人已经给出了适当的答案。 - Rowland Shaw
我的错误...它是本地的C++。 - Niko Gamulin

3
我想你的意思是希望从C#中调用现有的C++代码,而对C++代码进行最少的更改。
我是C++/CLI in Action这本书的粉丝和最近的购买者,书中有几个有用的示例章节可在线查看。 CodeProject上的介绍是一个很好的起点。
C++/CLI in Action的作者在他的索引上有许多关于C++/CLI的文章。 P/Invoke的维基百科文章列出了许多你可能不想使用这种方法的原因,我也同意:
  • 编译器失去类型支持
  • 可能存在数据类型或对齐问题,因为您必须手动映射类型
  • 需要固定垃圾回收对象

MSDN上最好的起点是概述文章



0

可能最简单的方法是创建一个C++/CLI项目,这将使您能够混合受控和非受控C++。然后,您可以使用托管的.Net包装器将现有的非托管C++类包装起来,以便您的C#代码可以直接调用。MSDN杂志上有一篇关于C++/CLI的入门文章

Interop仅在调用C样式函数时真正有用。您无法真正使用它与纯C++类进行交互。


0
我是通过实践学习的,所以我没有一个好的教程,但有几件事情你需要注意——托管 C++ 和 C++/CLI 都可以与非托管代码集成,而且接口很少出现问题。但是 C# 不是这种情况。在托管 C++ 中,很可能会做出像这样的事情:
dotNetForm->Text = S"My Project"; // regular managed code
::SetWindowText(dotNetForm->Handle, "Your Project"); // mixed managed/unmanaged

而在C#中,你需要P/Invoke到SetWindowText——虽然你真的不需要这么做:这只是一个简单的例子,但你需要知道托管C++编译器是一种奇怪的组合,它会透明地为你执行大量的互操作,同时又什么都不为你做(即,它不会进行任何隐式的封送)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接