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

时间:2009-01-15 13:42:11

标签: c# c++ code-migration

我想创建一个C#项目并实现现有的本机(C ++)代码。有谁知道任何关于它的好教程?

谢谢!

6 个答案:

答案 0 :(得分:4)

您可以使用P / Invoke,您可以调用非托管方法。 我会给你发一些例子: This是对MSDN官方文档的引用。 This是一个社区mantained网站,其中包含大多数常见的Windows非托管库以及方法签名和示例

答案 1 :(得分:3)

如果您的C ++代码是管理的(如您所说),那么我建议您将其保留为C ++ ,除非您有充分的理由 - 未来的C#(等)程序集应该能够“按原样”引用它。

答案 2 :(得分:3)

我假设通过实现现有代码,你的意思是你想从C#中调用它,只需对C ++代码进行最小的更改。

我是该书C++/CLI in Action的粉丝和最近购买者,该书在线有几个有用的示例章节。

这个intro on CodeProject是一个很好的起点。

C ++ / CLI in Action的作者在CodeProject上有很多文章,向下滚动到his index上的C ++ / CLI部分。

Wikipedia article on P/Invoke有许多理由说明您可能不想使用这种方法,我同意这一点:

  • 编译器失去打字支持
  • 可能的数据类型或对齐问题,因为您必须手动映射类型
  • 需要固定垃圾收集对象

MSDN上的最佳起点是summary article

答案 3 :(得分:0)

答案 4 :(得分:0)

最简单的方法可能是创建一个C ++ / CLI项目,这将使您能够混合托管和非托管C ++。然后,您可以使用C#代码可以直接调用的托管.Net包装器来包装现有的非托管C ++类。 MSDN杂志在C ++ / CLI上有一个很好的介绍article

Interop只对调用C风格的函数非常有用。您无法真正使用它与纯C ++类进行交互。

答案 5 :(得分: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 ++编译器是做很多互操作的奇怪组合为你透明,同时为你做任何事情(也就是说,它不会进行隐式的编组)。