<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=C%2B%2B%2FCLI</id>
	<title>C++/CLI - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=C%2B%2B%2FCLI"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=C%2B%2B/CLI&amp;action=history"/>
	<updated>2026-06-12T01:07:22Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=C%2B%2B/CLI&amp;diff=172123&amp;oldid=prev</id>
		<title>imported&gt;Siegbert v2: + Literatur / Eigenschaften sind hier ein Synonym von Attributen in der OOP / Kleinigkeiten</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=C%2B%2B/CLI&amp;diff=172123&amp;oldid=prev"/>
		<updated>2025-06-24T06:18:59Z</updated>

		<summary type="html">&lt;p&gt;+ Literatur / Eigenschaften sind hier ein Synonym von Attributen in der OOP / Kleinigkeiten&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;C++/CLI&amp;#039;&amp;#039;&amp;#039; ist eine von [[Microsoft]] entwickelte Variante der [[Programmiersprache]] [[C++]], die den Zugriff auf die virtuelle [[Laufzeitumgebung]] des [[.Net-Framework]]s mit Hilfe von speziell darauf zugeschnittenen Spracherweiterungen ermöglicht.&lt;br /&gt;
&lt;br /&gt;
C++/CLI erfüllt die ebenfalls von Microsoft entwickelte Spezifikation namens [[Common Language Infrastructure]] (CLI) zur Sprach- und Plattform-neutralen Entwicklung und Ausführung von .NET-Anwendungen. Programme, die in C++/CLI geschrieben sind, können vom Compiler in [[Common Intermediate Language|CIL]] übersetzt und auf der [[Virtuelle Maschine|virtuellen Maschine]] der .NET-Plattform betrieben werden.&lt;br /&gt;
&lt;br /&gt;
Seit Dezember 2005 liegt ein offiziell von der [[Ecma International|Ecma]] ratifizierter Standard für C++/CLI vor.&lt;br /&gt;
&lt;br /&gt;
[[Microsoft Visual Studio .NET|Microsoft Visual Studio]] ab Version 2005 und das Compiler-Frontend der [[Edison Design Group]] bieten eine Implementierung von C++/CLI an.&amp;lt;ref&amp;gt;{{Internetquelle |url=https://www.edg.com/docs/edg_cpp.pdf |titel=C++ Front End |titelerg=Internal Documentation (excerpt); Version 6.5 |werk=edg.com |hrsg=Edison Design Group |datum=2023-06-21 |format=PDF; 529&amp;amp;nbsp;kB |sprache=en |abruf=2023-08-08}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sinn und Zweck der Erweiterungen ==&lt;br /&gt;
&lt;br /&gt;
Ziele bei der Entwicklung von C++/CLI waren:&lt;br /&gt;
* Schaffung einer eleganten [[Syntax]], die gut zum bisherigen C++ passt. Wer bereits mit C++ vertraut ist, soll die Spracherweiterungen als möglichst natürlich empfinden.&lt;br /&gt;
* Komfortable Unterstützung von Besonderheiten der CLI wie [[Attribut (Programmierung)|Eigenschaften]], [[Ereignis (Programmierung)|Ereignisse]], [[Generischer Typ|generische Typen]], [[automatische Speicherbereinigung]], [[Referenz (Programmierung)|Referenzklassen]] usw.&lt;br /&gt;
* Gute Unterstützung von Sprachmitteln, die im bisherigen C++ verbreitet sind, wie etwa Templates oder deterministische Deinitialisierungen, und zwar für alle Typen, einschließlich der neuartigen CLI-Klassen.&lt;br /&gt;
* Kompatibilität mit bestehenden C++-Programmen durch das Einbringen von fast ausschließlich reinen Erweiterungen gegenüber [[Internationale Organisation für Normung|ISO]]-C++.&lt;br /&gt;
&lt;br /&gt;
== Unterschiede zu Managed C++ ==&lt;br /&gt;
&lt;br /&gt;
C++/CLI ist das Ergebnis einer grundlegenden Überarbeitung von Managed C++, der ersten Version von C++ mit Spracherweiterungen für die .NET-Plattform. Managed C++ litt unter Akzeptanzproblemen, weil viele Programmierer die Syntaxerweiterungen als schwer lesbar empfanden. Beispielsweise enthielt die Syntax Bestandteile, die nicht eindeutig erkennen ließen, ob verwaltete oder nichtverwaltete [[Objekt (Programmierung)|Objekte]] erzeugt werden.&amp;lt;ref&amp;gt;{{Internetquelle |autor=Kenny Kerr |url=https://learn.microsoft.com/en-us/previous-versions/ms379617(v=vs.80) |titel=C++: The Most Powerful Language for .NET Framework |werk=learn.microsoft.com |hrsg=Microsoft |datum=2004-07 |sprache=en |abruf=2010-10-21}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch wirkten die mit Managed C++ eingeführten Syntaxelemente für viele Programmierer behelfsmäßig in die Sprache integriert. So waren z.&amp;amp;nbsp;B. viele [[Schlüsselwort (Programmierung)|Schlüsselwörter]] eingeführt worden, die mit zwei Unterstrichen beginnen. Zwar ist dies bei Spracherweiterungen gegenüber Standard-C++ üblich, die große Anzahl solcher Schlüsselwörter, sowie deren starke Durchdringung in Programmen, die von den Erweiterungen Gebrauch machten, wirkten jedoch störend auf das Gesamtbild der Quelltexte.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Managed C++&lt;br /&gt;
! C++/CLI&lt;br /&gt;
|-----&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family:monospace;color:#0000FF&amp;quot;&amp;gt;__gc __interface&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color:#0000FF&amp;quot;&amp;gt;interface class&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
|-----&lt;br /&gt;
|&amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;Console::WriteLine(&amp;lt;span style=&amp;quot;color:#0000FF&amp;quot;&amp;gt;S&amp;lt;/span&amp;gt;&amp;quot;{0}&amp;quot;, &amp;lt;span style=&amp;quot;color:#0000FF&amp;quot;&amp;gt;__box(&amp;lt;/span&amp;gt;15&amp;lt;span style=&amp;quot;color:#0000FF&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt;);&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;Console::WriteLine(&amp;quot;{0}&amp;quot;, 15);&amp;lt;/span&amp;gt;&lt;br /&gt;
|----&lt;br /&gt;
|align=&amp;quot;center&amp;quot; colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
|-----&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color:#0000FF&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; f()&amp;lt;span style=&amp;quot;color:#0000FF&amp;quot;&amp;gt;__gc[]&amp;lt;/span&amp;gt;; // Deklaration&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color:#0000FF&amp;quot;&amp;gt;array&amp;lt;int&amp;gt;^&amp;lt;/span&amp;gt; f(); // Deklaration&amp;lt;/span&amp;gt; &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-----&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;Object&amp;lt;span style=&amp;quot;color:#0000FF&amp;quot;&amp;gt;*&amp;lt;/span&amp;gt; A &amp;lt;span style=&amp;quot;color:#0000FF&amp;quot;&amp;gt;__gc[]&amp;lt;/span&amp;gt; = { &amp;lt;span style=&amp;quot;color:#0000FF&amp;quot;&amp;gt;__box(&amp;lt;/span&amp;gt;41&amp;lt;span style=&amp;quot;color:#0000FF&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color:#0000FF&amp;quot;&amp;gt;__box(&amp;lt;/span&amp;gt;42&amp;lt;span style=&amp;quot;color:#0000FF&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt; };&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color:#0000FF&amp;quot;&amp;gt;array&amp;lt;&amp;lt;/span&amp;gt;Object&amp;lt;span style=&amp;quot;color:#0000FF&amp;quot;&amp;gt;^&amp;gt;^&amp;lt;/span&amp;gt; A = { 41, 42 };&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
1) Deklaration einer Funktion f, die eine CLI-Reihung (array) zurückgibt.&lt;br /&gt;
&lt;br /&gt;
Im Unterschied zu Managed C++ wird die [[Destruktor]]-Syntax &amp;lt;code&amp;gt;~T()&amp;lt;/code&amp;gt; nicht mehr auf den [[Garbage Collection#Finalisierung|Finalisierer]] abgebildet. Destruktor und Finalisierer werden in C++/CLI unterschieden; der Finalisierer hat jetzt die Syntax &amp;lt;code&amp;gt;!T()&amp;lt;/code&amp;gt;. Der Destruktor ist außerdem identisch mit der Funktion &amp;lt;code&amp;gt;Dispose&amp;lt;/code&amp;gt; (dies wurde durch technische Änderungen an der [[Common Language Runtime|CLR]] ermöglicht).&lt;br /&gt;
&lt;br /&gt;
== Weitere Neuerungen ==&lt;br /&gt;
Weitere Neuerungen gegenüber ISO-C++ sind: verbesserte Aufzählungsklassen (enum class), [[Delegate (CLI)|Delegaten]], Verpacken (&amp;#039;&amp;#039;boxing&amp;#039;&amp;#039;), Schnittstellenklassen, versiegelte Klassen, [[Attribut (Programmierung)#C#|Attribute]] usw.&lt;br /&gt;
&lt;br /&gt;
== Objektzeiger ==&lt;br /&gt;
Die augenfälligste Neuerung ist die Syntax &amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt; für Objektzeiger (manchmal auch &amp;#039;&amp;#039;[[Handle]]s&amp;#039;&amp;#039; genannt). Beispiel:&lt;br /&gt;
&lt;br /&gt;
 T&amp;lt;span style=&amp;quot;color:#0000FF&amp;quot;&amp;gt;^&amp;lt;/span&amp;gt; whole_object_pointer = &amp;lt;span style=&amp;quot;color:#0000FF&amp;quot;&amp;gt;gcnew&amp;lt;/span&amp;gt; T(a, b);&lt;br /&gt;
&lt;br /&gt;
Dabei ist &amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;gcnew&amp;lt;/span&amp;gt; ein Operator zur [[Allokation (Informatik)|Allokation]] von Objekten, die von der [[Automatische Speicherbereinigung|automatischen Speicherbereinigung]] verwaltet werden.&lt;br /&gt;
&lt;br /&gt;
Im Vergleich dazu die herkömmliche Syntax für [[Zeiger (Informatik)|Zeiger]]:&lt;br /&gt;
&lt;br /&gt;
 T&amp;lt;span style=&amp;quot;color:#0000FF&amp;quot;&amp;gt;*&amp;lt;/span&amp;gt; plain_old_pointer = &amp;lt;span style=&amp;quot;color:#0000FF&amp;quot;&amp;gt;new&amp;lt;/span&amp;gt; T(a, b);&lt;br /&gt;
&lt;br /&gt;
=== Deinitialisierung und Speicherfreigabe ===&lt;br /&gt;
Anders als bei gewöhnlichen Zeigern wird beim Löschen von Handles mittels &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; zwar der Destruktor aufgerufen, nicht aber der Speicher freigegeben. Stattdessen wird der vom Objekt belegte Speicher durch die automatische Speicherbereinigung an das System zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Im Unterschied zu anderen Sprachen mit automatischer Speicherbereinigung (z.&amp;amp;nbsp;B. [[C-Sharp|C#]] oder [[Java (Programmiersprache)|Java]]) wird hier also die problematische Zusammenfassung der Verwaltung von Speicher und anderen Ressourcen voneinander getrennt: Speicher und andere Ressourcen werden nicht mehr zusammen mit Hilfe der Speicherbereinigung freigegeben (also keine deterministische Deinitialisierung); siehe [[Automatische Speicherbereinigung#Finalisierung|Finalisierung]].&lt;br /&gt;
&lt;br /&gt;
=== Als automatische Variablen anlegbare CLI-Objekte ===&lt;br /&gt;
Eine weitere technische Neuerung und einer der wichtigsten Unterschiede zu anderen Sprachen mit automatischer Speicherbereinigung sind die als [[automatische Variable]]n (d.&amp;amp;nbsp;h. auf dem Stack) anlegbaren CLI-Objekte. Die Lebensdauer von automatischen Variablen endet in dem Augenblick, in welchem sie ihren [[Gültigkeitsbereich]] verlassen.&lt;br /&gt;
&lt;br /&gt;
Im Zusammenspiel mit den neuartigen Objektzeigern bleiben in C++ dadurch häufig angewandte Programmiertechniken wie [[Ressourcenbelegung ist Initialisierung|RAII]] (Abkürzung für engl. &amp;#039;&amp;#039;resource acquisition is initialization&amp;#039;&amp;#039;) auch für die mit der automatischen Speicherbereinigung verwalteten CLI-Objekte möglich. Fehleranfällige Kodiertechniken, wie sie aus anderen Programmiersprachen bekannt sind, lassen sich damit vermeiden.&lt;br /&gt;
&lt;br /&gt;
Dazu ein Beispiel in C++/CLI:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void Uebertragung()&lt;br /&gt;
{&lt;br /&gt;
  MessageQueue source(&amp;quot;server\\sourceQueue&amp;quot;);&lt;br /&gt;
  String^ mqname = safe_cast&amp;lt;String^&amp;gt;(source.Receive().Body);&lt;br /&gt;
&lt;br /&gt;
  MessageQueue dest1(&amp;quot;server\\&amp;quot; + mqname), dest2(&amp;quot;backup\\&amp;quot; + mqname);&lt;br /&gt;
  Message^ message = source.Receive();&lt;br /&gt;
  dest1.Send(message);&lt;br /&gt;
  dest2.Send(message);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Beim Verlassen der Funktion &amp;lt;code&amp;gt;Uebertragung&amp;lt;/code&amp;gt; (mit &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; oder beim Auftreten einer [[Ausnahmebehandlung|Ausnahme]]) rufen Objekte implizit ihre Funktion &amp;lt;code&amp;gt;Dispose&amp;lt;/code&amp;gt; auf, und zwar in umgekehrter Reihenfolge zu ihrer Konstruktion. Im obigen Beispiel also wird zuerst der Destruktor von &amp;lt;code&amp;gt;dest2&amp;lt;/code&amp;gt; aufgerufen, dann der von &amp;lt;code&amp;gt;dest1&amp;lt;/code&amp;gt; und zuletzt der von &amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt;, da diese Objekte in der Reihenfolge &amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dest1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dest2&amp;lt;/code&amp;gt; konstruiert wurden.&lt;br /&gt;
&lt;br /&gt;
Wenn ein automatisches Objekt seinen Gültigkeitsbereich verlässt, oder beim Löschen mit &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; wird sein Destruktor aufgerufen. Der Compiler unterdrückt dann den Aufruf der normalerweise von der automatischen Speicherverwaltung angestoßenen [[Automatische Speicherbereinigung#Finalisierung|Finalisierungsfunktion]].&lt;br /&gt;
&lt;br /&gt;
Der Wegfall von Finalisierungsfunktionen kann sich insgesamt positiv auf die Ausführungsgeschwindigkeit auswirken, hilft aber noch andere Probleme zu vermeiden; zu Problemen bei Verwendung der Finalisierungsfunktion siehe [[Automatische Speicherbereinigung#Finalisierung|Finalisierung]].&lt;br /&gt;
&lt;br /&gt;
Im Unterschied zu C++/CLI muss beispielsweise in Java oder C# zur Ressourcenfreigabe eine entsprechende Funktion (in C# &amp;lt;code&amp;gt;Dispose&amp;lt;/code&amp;gt;, in Java meist &amp;lt;code&amp;gt;close&amp;lt;/code&amp;gt;) immer explizit aufgerufen werden. Beide Sprachen haben daher spezielle Syntaxkonstrukte entwickelt, mit denen solche Aufrufe sichergestellt werden sollen: In C# sind das die sogenannten &amp;#039;&amp;#039;using-Blöcke&amp;#039;&amp;#039;, in Java das &amp;#039;&amp;#039;try-with-resources&amp;#039;&amp;#039;-Konstrukt. Solche Blöcke nehmen dem Programmierer zwar die Sicherstellung von Dispose-Aufrufen beim Verlassen des Blocks ab, müssen aber immer mitangegeben werden und sind daher in dieser Hinsicht immer noch fehleranfälliger als die deterministische Deinitialisierung von C++/CLI.&lt;br /&gt;
&lt;br /&gt;
== Vergleich mit anderen .NET-Sprachen ==&lt;br /&gt;
Eine Besonderheit von C++/CLI ist die Mischbarkeit von Code, der auf der virtuellen Maschine läuft, und Code, der direkt auf der [[CPU]] ausgeführt wird. Beide Arten von Programmcode können in einer einzigen Programmdatei zusammengestellt werden.&amp;lt;ref&amp;gt;{{Internetquelle |autor=Tyler Whitney et al. |url=https://learn.microsoft.com/en-us/cpp/dotnet/mixed-native-and-managed-assemblies |titel=Mixed (native and managed) assemblies |werk=learn.microsoft.com |hrsg=Microsoft |datum=2021-08-03 |sprache=en |abruf=2023-08-08}}&amp;lt;/ref&amp;gt; Mit dieser Möglichkeit nimmt C++/CLI bislang eine Sonderstellung unter den .NET-Sprachen ein.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* {{Literatur |Autor=Julian Templeman |Titel=Microsoft Visual C++/CLI Step by Step |Verlag=Microsoft Press |Datum=2013 |Sprache=en |ISBN=978-0-7356-7517-9}}&lt;br /&gt;
* {{Literatur |Autor=Vivek Ragunathan |Titel=C++/CLI Primer: For .NET Development |Verlag=Apress |Ort=New York |Datum=2016 |Sprache=en |ISBN=978-1-4842-2366-6}}&lt;br /&gt;
* {{Literatur |Autor=Gordon Hogenson |Titel=C++/CLI: The Visual C++ Language for .NET |Verlag=Apress |Ort=New York |Datum=2016 |Sprache=en |ISBN=978-1-4842-2027-6}}&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* &amp;#039;&amp;#039;[https://www.ecma-international.org/publications-and-standards/standards/ecma-372/ Standard ECMA-372: C++/CLI Language Specification]&amp;#039;&amp;#039; (englisch)&lt;br /&gt;
* &amp;#039;&amp;#039;[https://learn.microsoft.com/en-us/previous-versions/ms379617(v=vs.80) C++: The Most Powerful Language for .NET Framework]&amp;#039;&amp;#039; (englisch)&amp;lt;br /&amp;gt;Beschreibung der Gründe für die Syntaxänderungen von Managed C++ nach C++/CLI.&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:C++]]&lt;br /&gt;
[[Kategorie:.NET]]&lt;br /&gt;
[[Kategorie:Virtuelle Maschine]]&lt;br /&gt;
[[Kategorie:Programmiersprache für die Common Language Runtime]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Siegbert v2</name></author>
	</entry>
</feed>