我想创建一个C#项目并实现现有的本机(C ++)代码。有谁知道任何关于它的好教程?
谢谢!
答案 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)
为什么不尝试使用C ++代码的托管包装器。
答案 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 ++编译器是做很多互操作的奇怪组合为你透明,同时为你做任何事情(也就是说,它不会进行隐式的编组)。