你推荐 Native C++ 到 C++\CLI 的转变吗? [复制]

Posted

技术标签:

【中文标题】你推荐 Native C++ 到 C++\\CLI 的转变吗? [复制]【英文标题】:Do you recommend Native C++ to C++\CLI shift? [duplicate]你推荐 Native C++ 到 C++\CLI 的转变吗? [复制] 【发布时间】:2008-09-30 09:55:15 【问题描述】:

在过去的几年里,我一直是一名本地 C++ 程序员。现在我们从头开始一个新项目。那么您对以丢失平台无关代码为代价转向 C++\CLI 的想法是什么?转向 C++\CLI 是否有什么特殊优势?

【问题讨论】:

查看 Bjarne Stroustrup 关于 C++/CLI 的简短常见问题解答帖子。虽然他不喜欢它并不奇怪,但他不这样做的原因非常有启发性。 www2.research.att.com/~bs/bs_faq.html#CppCLI @Chinmay:你为什么不把这个作为答案发布?我很想投票! 【参考方案1】:

根据我在 C++、C# 和 .NET 方面的经验,我会推荐以下内容:

如果您想采用 .NET 方式,请使用 C#。 如果您不需要 .NET,请使用传统 C++。 如果您必须将传统 C++ 与 .NET 代码连接起来,请使用 C++/CLI。既适用于 .NET 调用 C++ 类,也适用于 C++ 调用 .NET 类。

如果你不需要它,我认为只使用 C++/CLI 是没有意义的。

【讨论】:

而且,考虑到 VS2010 没有 C++/CLI 的代码完成 (IntelliSense),所以你必须使用 3rd 方工具或 VS2008。【参考方案2】:

切换前需要考虑的一些问题:

[1] 坚持使用 Windows 还好吗?有其他操作系统的 .NET 克隆,但您的应用程序不会只是透明地运行。您可能不需要的复杂性。

[2] 您是否正在考虑仅为垃圾收集支持而切换?如果是这样,您可以只使用一些 C++ 垃圾收集器库。如果你弄清楚如何利用 std::shared_ptr,你可能不会觉得需要垃圾收集器。您可能不需要的开销。

[3] 您是否考虑使用 C++/CLI 是因为垃圾收集和您可以利用的所有有用的 .NET 类?如果是这样,为什么不直接切换到 C#。 C++/CLI 是一种过渡性技术,最好不要在这类事情上投入资源。 c# 变得相当成熟和可用。

就个人而言,我会坚持使用 C++ ;)。

【讨论】:

【参考方案3】:

对你有什么好处吗?您可能会失去切换到另一个操作系统的能力。

【讨论】:

【参考方案4】:

除非您正在与 .NET 应用程序集成,否则请不要打扰。当然不要使用 STL/CLR,因为它的性能真的很糟糕。

切换开关以使用 .NET 类库很诱人,但还有其他选择。如果这样做,您将无法如此轻松地移植代码。

OSS 的兴起似乎也在增加,所以现在可能是研究使用跨平台库和工具的时候了。您可以比 Windows 更轻松地部署 linux 应用程序(通过发布完全配置的操作系统!),如果您部署 linux 客户端(因为它们是免费的),您将获得更好的投资回报率。

如果我是一名商人,我希望至少能够在 linux 或 mac 上进行部署,而不仅仅是 windows。从战略上讲,我不想打赌世界会在 5 年内留在微软。

【讨论】:

【参考方案5】:

迁移到 C++/CLI 的主要优势是可以访问 .NET 库和框架本身(垃圾收集等)。然而,据我所知,存在 C++/CLI 的主要原因是为了简化现有 C++ 代码的移植以在 .NET 框架中运行。鼓励新项目使用 C#。

如果您需要使用与 .NET 框架混合的现有 C++ 代码,那么使用 C++/CLI 是有意义的,但通常您应该从 C# 开始。

如果新项目需要广泛使用 .NET 中的某些内容(可能是更简单的 GUI 设计或其他内容),则使用 C#。如果没有,那么坚持使用原生 C++。我认为你这样做不会失去任何东西。

【讨论】:

【参考方案6】:

我非常不喜欢 C++/CLI,因此我建议您不要使用 C++/CLI,就像我描述的 here 一样。有人建议使用 C++/CLI 作为标准 C++ 和 C# 之间的桥梁,但由于 C++/CLI 的设计方式,使用这种方式非常繁琐(您必须手动创建可以从C#)。因此,我会推荐 SWIG 来代替标准 C++ 与 C# 的接口(尽管不可否认,SWIG 有相当长的学习曲线)。

【讨论】:

【参考方案7】:

看看这两篇文章:

A Critical Overview of C++/CLI, Part I

A Critical Overview of C++/CLI, Part II

我相信你现在是 我深信 C++/CLI 是 既不是“C++ 的扩展集” (在很多方面它实际上是一个 C++ 的子集),也与 C++ 比任何其他语言都多 分号和花括号。 此外,C++/CLI 绝对是一个 面向Windows的编程语言; 它绝对不是一种语言 Solaris 10 服务器或诺基亚手机 手机会很开心的运行。做什么 和C++有什么关系?

【讨论】:

【参考方案8】:

使用 C++/CLR 的一个主要缺点是,如果代码没有被充分模糊,可能会丢失您的 IP(知识产权)。总的来说,我同意这里其他成员的发言。如果您想要独立于 MS .net vm 的可移植代码,那么本机 C/C++ 是您的最佳选择。

【讨论】:

以上是关于你推荐 Native C++ 到 C++\CLI 的转变吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在Visual Studio 2010中将Native / C ++ DLL链接到托管C ++ / CLI包装器

是否可以在 C# 中从本机 C++ 类创建变量?

(C++/CLI) 如何在 C++ CLI 中获取从本机代码到托管代码的回调?

如何将 C++ 本机对象编组到托管 C++ CLI

使用 C++/CLI 包装器将二维数组从 C# 传递到非托管 C++

为啥我们不能将本地 C++ 的引用传递给 C++/CLI?