3

在我们的项目中,我们有三个模块。C++(本机)、C++/CLI、C#。我们正在使用 C++/CLI 在 C# 中使用 C++(Native) 代码。为此,我们将 C++(Native) 与 C++/CLI 静态链接,现在我们可以将 C++/CLI 托管的 dll 与 C# 一起使用。

现在,C++(Native)中的代码是简单的数学算法(没有 Win32,没有与操作系统的交互)。当我将静态库与 C++/CLI 链接时,它不会成为托管代码吗?意味着它不会属于 CLR。

在 C# 中使用带有 C++/CLI 的 C++(Native) 静态库会提高我的性能吗?我能不能实现用 C# 本身而不是本机代码编写代码。

请注意,我们在 C++(本机)代码中广泛使用了标准 C++ 库的算法、容器和迭代器。

谢谢。

4

1 回答 1

8

当我将静态库与 C++/CLI 链接时,它不会成为托管代码吗?意味着它不会属于 CLR。

不,不一定。在 C++/CLI 中,所有托管类型都将编译为 MSIL,代码将在 CLR 下运行。本机类型要么编译为 MSIL 或本机机器代码,具体取决于您的编译器选项

  • /clr选项生成本机代码和托管代码的混合。
  • /clr:pure选项生成一个仅托管程序集,该程序集可以包含编译为 MSIL 的本机类型。/unsafe这基本上像使用该选项编译的 C# 代码一样工作。
  • /clr:safe选项生成不包含本机代码的仅托管程序集。这基本上就像没有/unsafe选项编译的C# 代码一样工作。

在 C# 中使用带有 C++/CLI 的 C++(Native) 静态库会提高我的性能吗?我能不能实现用 C# 本身而不是本机代码编写代码。

像所有优化问题一样,答案是视情况而定。一方面,本机代码通常比托管代码更快,并且可以更高度优化(例如,使用 SIMD)。另一方面,存在与混合模式程序集相关的性能损失。C++ 互操作实现通常非常快(肯定比 C# 中的 P/Invoke 快得多),但如果您从编译为本机代码获得的收益不够大,那么它可能仍然不值得。真正知道的唯一方法是测试这两个选项。

托管代码经常受到不好的评价,尤其是经验丰富的 C++ 程序员,但事实是,编写良好的 C# 代码可以与等效的原生 C++ 代码一样快,甚至更快。在 C++ 中自欺欺人也容易得多,因此,如果您的开发人员团队是 C# 专家而不一定是 C++ 专家,那么您最终可能会得到写得不好且速度较慢的 C++ 代码最后,当您的项目的其余部分全部使用 C# 时,降低的维护成本可能意味着即使是相似的性能也是可以接受的。

于 2013-08-01T11:01:34.647 回答