3

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

谢谢!

4

6 回答 6

4

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

于 2009-01-15T13:44:45.457 回答
3

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

于 2009-01-15T13:48:57.477 回答
3

我假设通过实现现有代码意味着您想从 C# 调用它,而对 C++ 代码的更改最少。

I'm a fan and recent purchaser of the book C++/CLI in Action which has a couple of useful sample chapters online.

This intro on CodeProject is a good starting point.

The author of C++/CLI in Action has a number of articles on CodeProject, scroll down to the C++/CLI section on his index.

The Wikipedia article on P/Invoke has a number of reasons why you might not want to use that approach, with which I agree:

  • loss of typing support by the compiler
  • possible data type or alignment issues as you have to map types by hand
  • need to pin garbage-collected objects

The best starting point on MSDN is the summary article.

于 2009-01-18T16:28:27.957 回答
0

您为什么不尝试为您的 C++ 代码使用托管包装器。

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmxspec/html/vcmg_accessingcodefromframeworkobjects.asp

于 2009-01-15T13:46:07.217 回答
0

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

互操作只会对调用 C 风格的函数真正有用。您不能真正使用它与纯 C++ 类进行交互。

于 2009-01-15T13:50:14.480 回答
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++ 编译器是一个奇怪的组合,它透明地为您执行大量互操作同时什么也不为你做(即,它不会做任何隐含的编组)。

于 2009-01-15T13:50:34.340 回答