C++和C++.NET之间的主要区别是什么?

32
4个回答

49

是否正确认为C++是非托管代码,而C++.NET是托管代码?

不存在所谓的"C++.NET"。有C++/CLI,它基本上是带有Microsoft扩展的C++语言,使您可以编写面向.NET框架的代码。 C++/CLI代码编译为CLR字节码,并像C#一样在虚拟机上运行。 我们假设您实际上是在谈论C++/CLI。

关于这点,人们可以说标准C++是非托管的,而C++/CLI是托管的,但这是非常Microsoft的术语。 除非与C++/CLI进行比较,否则在讨论标准C++时不会看到“非托管”一词被用于此方式。

标准C++和C++/CLI都可以由同一个Visual C++编译器编译。前者是VC ++编译器的默认值,而需要编译后者模式时需要编译器开关。


我需要使用C++编写项目。为了更好地构建GUI,我倾向于使用C++.NET。

您可以像使用C++/CLI一样使用C++来构建GUI程序。只是因为标准C++中没有像.NET框架一样用于构建GUI的标准库,所以这会更加困难,但是有许多开源项目如QtwxWidgets提供了C++ GUI框架。


我还有另一个普通的C++库(非托管的C++ dll),它是否可以在C++.NET项目中作为普通dll库使用?

是的。处理不同的标准C++数据类型和.NET数据类型可能需要一些额外的工作,但您肯定可以使其正常工作。


感谢您的快速回答。那么,我应该使用Visual Studio中的C++/CLI来构建GUI,而不是使用QT或wxWidgets吗?因为使用QT或wxWidgets会引入我的应用程序的另一个依赖项。我想,如果我只使用C++/CLI managed,我只需要拥有.NET框架。使用C++/CLI、QT和wxWidgets的优缺点是什么?您能帮我澄清一下吗?提前致谢。 - olidev
@devn:.NET框架也是一个依赖项,甚至比Qt或wxWidgets还要大,所以你无论如何都需要一个依赖项。请注意,Qt和wxWidgets不需要.NET框架即可正常工作。 - In silico
1
使用wxWidgets或QT可以使您的应用程序在多个平台上具备可移植性。.NET保证您固定在VisualStudio / Windows上。如果您已经熟悉.NET Framework,与使用全新框架相比,它可以减少工作量。另一方面,使用纯C++库不会引入额外的层(ref类与本地类)需要掌握。简而言之 - 它取决于您的知识和用例。 - Tobias Langner
@In silico:不一定。如果你计划只在Windows上部署,并且始终想使用Visual Studio,那么.NET Framework并不是一个大问题。它已经在大多数计算机上可用,而QT/WX则不是。 - Tobias Langner
1
@Tobias Langner:在客户端运行Qt或wxWidgets应用程序时,不需要安装Qt或wxWidgets“运行时”。据我所知,它们可以静态编译,并且这些框架仅依赖于操作系统原语。如果不是静态的,则只需随应用程序一起提供一个DLL即可。 - In silico
显示剩余7条评论

12

Managed C++是微软提出的一组已经废弃的C++语法和语言扩展,包括语法和句法扩展、关键字和属性,旨在将C++语法和语言引入.NET Framework。这些扩展允许把C++代码作为托管代码以及与本地代码互操作,并且能够针对公共语言运行时(CLR)进行编译。然而,Managed C++不是一种完整的独立语言或全面的编程语言。

Managed C++

#using <mscorlib.dll>
using namespace System;

int main()  {
  Console::WriteLine("Hello, world!");
  return 0;
}

纯C++

#include <iostream>
using namespace std;

int main()
{
  cout << "Hello, world!";
 return 0;
}

9
完全没有用的“信息”。 明显的问题是在询问不被弃用的 C++/CLI。 - IInspectable

9
很好...C++ .NET 这个说法是有点误导人的。你可以使用 Visual Studio .NET 编写 C++ 代码。不过那是很久以前的称呼了。现在人们称之为带有.NET标识的 Visual Studio。至少,现在它的启动画面上不再有大大的.NET字样了。
一般来说,在使用Visual Studio (VS)时,您可以使用托管和非托管语言进行编程(存在许多选择)。
如果您想使用Visual Studio编写C++代码,则有两个选择:
1.非托管或本机C/C++。这是您一直以来所了解的旧版(或新版)C++,并且您使用非托管内存进行编程。
2.托管C++。他们将其称为C++/CLI。注意读作C++ over CLI,不是C++除以CLI!该语言具有额外的关键字和一些额外的语法元素,使得其能够利用.NET Foundation类库并在.NET框架中执行其他有趣的操作。当然,这需要使用垃圾回收器来管理托管类型的内存。
就我个人而言,我最喜欢的语言是C#,但是如果您需要在C++和.NET之间进行互操作,那么绝对要使用托管C++。这很容易做到,并且我认为比使用其他P/Invoke方法要容易得多。
如果您要进行某个项目,我建议您使用C#来做UI并充分利用其所提供的所有功能。然后引用一个包含您的C++代码的混合模式托管库。我认为这样对您来说会更容易。
回答您最后一个问题的答案是肯定的,您绝对可以在应用程序中使用它。
以下是依赖关系的工作方式:
[C# 应用程序/GUI] 依赖于 [托管 C++ DLL],[托管 C++ DLL] 再依赖于 [Native C++ Lib]。

仅为补充说明- 现在,受C++/CLI的青睐,托管C++被认为是过时的(来源:http://stackoverflow.com/tags/managed-c%2B%2B/info)。 - StockB
让我们将它们结合起来。C#用户界面和C++框架。 - Gray Programmerz

3
  • 是的,C++是未管理代码,而C++/CLI是托管代码。
  • 是的,您可以在C++/CLI项目中使用未管理的C++ DLL。但是您必须为此编写一个包装器。这意味着您必须定义要在C++/CLI项目中访问的未管理方法。

例:

using System.Runtime.InteropServices;

[DllImport("YourDLLName")]
public static extern void UnmanagedMethodName(string parameter1);

1
这不是真的,你可以在C++/CLI项目中使用未管理的C++代码而不会遇到任何问题,也不需要额外的工作。 - Timbo
只需要 #include 头文件并链接到 .lib 文件吗?毕竟这是 C++。 - Timbo
没错,我一直在想C#。我的错。 - juergen d
@Timbo 感谢您的澄清。但我有一个dll文件而不是lib文件。我是否需要构建本机C++项目以生成lib文件而不是dll文件,以便包含头文件?或者也可以使用dll文件包含头文件吗?我不确定这一点。您知道如何将lib或dll文件添加到Visual Studio中的C++托管项目的示例吗?提前致谢。 - olidev
实际上,“C++ .Net”是一个错误的术语,不应该使用...它应该是C++/CLI。 - Yousha Aleayoub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接