【问题标题】:How to use existing C++ code in .NET (C#)如何在 .NET (C#) 中使用现有的 C++ 代码
【发布时间】:2009-01-15 13:42:11
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: c# c++ code-migration


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 好地方 - 我错过了它并将其读作“现有的un托管(C++)代码”。鉴于上下文,这很可能是一个错字。
      • 我从经验中发现,首先检查显而易见的东西总是值得的——当然,如果这是一个错字,那么很多人已经给出了合适的答案
      • 我的错误......它是原生 C++
      【解决方案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

      【讨论】:

        【解决方案4】:
        【解决方案5】:

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

        Interop 只有在调用 C 风格的函数时才真正有用。您不能真正使用它与纯 C++ 类进行交互。

        【讨论】:

          【解决方案6】:

          我通过这样做学到了这一点,所以我没有很好的教程,但是您需要注意几件事 - 托管 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++ 编译器是执行大量互操作的奇怪组合透明地为您服务,同时不为您做任何事情(即,它不会进行隐式编组)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-19
            • 2017-12-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多