【发布时间】:2009-01-15 13:42:11
【问题描述】:
我想创建一个 C# 项目并实现现有的本机 (C++) 代码。有谁知道关于它的任何好的教程?
谢谢!
【问题讨论】:
标签: c# c++ code-migration
我想创建一个 C# 项目并实现现有的本机 (C++) 代码。有谁知道关于它的任何好的教程?
谢谢!
【问题讨论】:
标签: c# c++ code-migration
如果您的 C++ 代码是托管的(如您所说),那么我建议您将其保留为 C++除非您有充分的理由 -- 未来的 C#(等)程序集应该能够按“原样”引用它。
【讨论】:
我假设 实现现有代码您的意思是您想从 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。
【讨论】:
可能最简单的方法是创建一个 C++/CLI 项目,这将使您能够混合托管和非托管 C++。然后,您可以使用 C# 代码可以直接调用的托管 .Net 包装器来包装现有的非托管 C++ 类。 MSDN 杂志在 C++/CLI 上有很好的介绍 article。
Interop 只有在调用 C 风格的函数时才真正有用。您不能真正使用它与纯 C++ 类进行交互。
【讨论】:
我通过这样做学到了这一点,所以我没有很好的教程,但是您需要注意几件事 - 托管 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++ 编译器是执行大量互操作的奇怪组合透明地为您服务,同时不为您做任何事情(即,它不会进行隐式编组)。
【讨论】: