**C++托管扩展**（Managed Extensions for C++）是对C++的一个属性和关键字的扩展，以便于在微软公司的.NET Framework进行编程。它也经常被称为托管C++。2002年由微软发布。

*注意：C++托管扩展自Visual C++ 2005起被一个新的语言规范，正在标准化的C++/CLI所取代。*

托管C++并非独立存在的编程语言，而仅仅是微软对C++的一个语法扩展，允许C++程序员在.NET框架和CLR的基础上进行托管编程。与C#和Visual Basic .NET相比，其主要优点是旧代码可以比较快地移植到新的平台上，而且即使不完全重写代码，也可以通过互操作在同一个模块中无缝整合托管和非托管代码，从新的.Net框架中获益。

.Net框架封装了大量的API，例如网络访问、字符串操作、数据访问、XML服务、图形界面控件库、邮件服务、加密服务、文件输入／输出，甚至是WMI管理，也使得应用程序员可以编写更加简洁的代码。目前只有托管C++及其后继者C++/CLI可以做到无缝整合托管和非托管代码，而在托管代码中调用COM的速度又相当慢，所以经常被用于其他语言和非托管代码之间的桥梁。

托管C++允许程序员编写托管代码，内存管理的工作现在可以让CLR去自动处理，访问时也增加了类型检查，减少了缓冲区溢出和内存泄漏的危险，增加了程序的稳定性，但是在性能敏感的应用中，庞大的.NET框架和缓慢的自动内存管理并不是必要的，传统非托管代码仍然是一些人的首选。

在面向对象编程方面，主要的变化是对多重继承的限制，这是因为CLR的限制和内存管理的需要。一个托管类不能多继承基类。同时，类属性和微软中间语言（MSIL）的引入也使得托管类可以在其他语言中使用和继承。

与此同时，托管C++引入了大量的关键字和语义转换，减少了代码的可读性和明确性。缺少在很多语言中都支持的泛型和for each语句也增加了其他语言的程序员转向托管C++的困难。在其后继者C++/CLI中泛型和for each语句才被支持。

Managed C++ 的重大改變
-----------------

**以下列出物件導向程式設計與 unmanaged C++ 之間的差異性。**

* (Global change) Existing C++ to be ported over the CLR must be appended with the following:

```
//hello.cpp

//new using directive
#using <mscorlib.dll>

//another using namespace directive.
using namespace System;

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

```

一個新的前置處理引導（preprocessor directive）

```
   #using <mscorlib.dll>
```

這是必須的。此外 #using directives 必須用 namespace 的方法來 import 更多的函式庫（libraries），像是 Base Class Library，例如：

```
  #using <System.Windows.Forms.dll>
```

以及

```
  using namespace System::Windows::Forms;
```

来使用 Windows Forms。

* To compile code to target the CLR, a new compiler option must be introduced.

```
   cl.exe hello.cpp /clr
```

/clr enables any code referencing the .NET Framework to be compiled as CIL。

* A class can be designated to be garbage collected via the `__gc` extension keyword.

```
//gc.cpp

#using <mscorlib.dll>

__gc class gc  {
  int* i;
  char* g;
  float* j;
};

int main()  {
  while(true)  {
    gc* _gc = new gc();
  }
  return 0;
}

```

### 比較 Managed C++

以下列出 Managed C++ 與其它程式語言在類似觀念上的差異。

#### ...to Java

**缺點**

* Java 幾乎可支持所有的平台，而 Managed C++ 僅可以在 Windows 或其它實作出 .NET Framework 的平台上執行。

* Java 程式碼複雜度較小，且易於閱讀，並提供有程式碼使用文件可供參考。而 Managed C++ 則無。 *（C++/CLI 於 Visual C++ .NET 2005 中已有支援）*

* Java 有許多開發工具與解決方案可提供開發者利用，Managed C++ 僅能使用 Visual Studio .NET。不過，*Managed C++ applications 可用免費的 Visual C++ Toolkit 2003 編譯。*

* Java 的例外機制是可以檢查的（checked）, Managed C++ 則無法檢查。 (根据程序不同这也可能是个优点)

**優點**

* Managed C++ 可以直接與系統低階（low level）服務介面溝通，Java 程式員必須使用 JNI (Java Native Interface) 與系統低階服務溝通。 *(仅限Windows)*

* Managed C++ 是無法檢查例外，Java 可以檢查。. (根据程序不同这也可能是个缺点)

#### ...to C#

**缺點**

* 一如 Java, C# 的複雜度較小。而且 C# 可以直接支援 .NET Framework 。

* C# 支援指標（pointers），如同 C++，這個機制預設是關掉的。

外部链接
----

* C++托管扩展语言规范（MSDN）（页面存档备份，存于）

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
.NET |
| --- |
|  |
|  | 
* .NET(.NET CORE) 3
* .NET框架
* Mono
* Compact Framework
* Micro Framework
* Silverlight
* SSCLI
* DotGNU(Portable.NET)

 |
|  |
| 架構 | 
* 基礎類別庫
* 共同語言執行期元件
* 碼存取安全性
* 組件
* 中介資料
* COM互通性
* .NET標準

 |
|  |
| 共同語言基礎架構 | 
* 共同語言基礎架構（CLI）
* 共同型別系統
* 共同中介語言
* 虛擬執行系統

 |
|  |
| CLI語言 | 

|  |  |
| --- | --- |
| 共同語言1 | 
* C#
* Visual Basic .NET
* C++/CLI（Managed）
* F#
* J#
* JScript .NET
* PowerShell

 |
|  |
| 其他語言2 | 
* Axum
* A#
* Boo
* Oxygene
* IronLisp
* IronPython
* IronRuby
* Nemerle
* Phalanger
* P#

 |

 |
|  |
| Core家族3 | 
* ASP.NET Core (
* Entity Framework Core
* ASP.NET Core MVC )

 |
|  |
| 元件 | 
* ADO.NET (Entity Framework
* Data Services)
* ASP.NET (AJAX
* Dynamic Data
* MVC
* Razor)
* ClickOnce
* 动态语言运行时
* LINQ
* MAUI
* Parallel FX Library (PLINQ
* TPL)
* WCF
* Windows Forms
* WPF
* Windows CardSpace
* WF（WWF）
* Remoting
* XAML

 |
|  |
| 比較 | 
* C#与Java
* C#与Visual Basic .NET
* Java与.NET平台

 |
|  |
| 即將推出 | 
* "Acropolis"
* "Jasper"

 |
|  |
| 1微软在Visual Studio或.NET Framework中提供了或者将提供支持的语言2被多數使用者使用，且非教學或研究型的語言。3具有跨平台（Windows, Mac OSX, Linux）能力的開發框架。 |

 |