【问题标题】:What is the best way to port a C++ library to C#?将 C++ 库移植到 C# 的最佳方法是什么?
【发布时间】:2011-11-06 23:26:47
【问题描述】:

我有一个(仅标题)C++ 库,我希望将其移植到 C#。它是我为特定目的制作的 win api 的包装。我想将它移植到 C#,因为我想使用 C# 进一步开发它。什么是最有效(也是最简单?)的移植方式。请注意,我不想要一些忙碌的事情,因为我不想花更多的时间移植库而不是首先制作那个库。那么有没有办法呢?

【问题讨论】:

  • @Cassio 让我的 lib 成为标头只是一个坏主意?
  • 一点也不。我也在 C++ 中使用标题。只需将其转换为 DLL 即可。我想没什么大不了的。
  • 视情况而定。许多高质量的纯头文件库都是这样的,因为它们大量使用模板,因此无法将代码移动到单独的编译单元中(因为它是在编译时生成的)。 C# 没有模板(我知道)的等价物,所以你会不走运。
  • @Mankarse 不,我没有在我的库中使用模板(尽管我即将使用)。我只是把它作为标题只是因为大多数函数都是内联的。
  • 为什么不使用 P/Invoke?它非常简单,只需几行代码就可以省去整个移植过程。

标签: c# c++ compatibility porting


【解决方案1】:

这在很大程度上取决于你的库有多大、它的结构、你的内存分配情况、你使用了多少 C# 中不可用的库(如 C++ 标准库)、多少 C++ 模板编程你用过等等。

不同的策略可能是

  • 尝试通过您自己的代码生成器自动移植(部分)它
  • 不要将其移植到 C#,而是使用 C++/CLI(我过去非常成功地做的事情)
  • 手动执行,因为到目前为止您使用的 C++ 概念不能很好地映射到 C#

“仅标题”似乎没有真正的区别。事实上,如果每个类只有一个 C++ 文件要移植到一个 C# 类文件,从技术上讲,事情可能会变得容易一些。

【讨论】:

    【解决方案2】:

    我能想到的几种方法。

    1. 在可能的 T4 代码生成帮助下手动转换为 C# dll。
    2. 将您的 c++ 库更改为托管 dll,以便您可以在 c# 项目中使用它。
    3. 当然,您可以在 C# 项目中使用与 c++ 库的互操作。但在那种情况下,我不确定你的 c++ 库的用途,因为你说它是一个包装器。

    由于您已经拥有可以完全控制的 c++ 库,我会先尝试使用 #2。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多