当我将静态库与 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# 时,降低的维护成本可能意味着即使是相似的性能也是可以接受的。