Kapitel 30 Interoperabilität
Eine der wichtigen Fähigkeiten von C# ist die,
mit vorhandenem Code interagieren zu können, unabhängig davon,
ob dieser COM-basiert ist oder in einer systemeigenen DLL enthalten ist. Dieses Kapitel bietet einen kurzen
Überblick darüber, wie die Interoperabilität funktioniert.
30.1 Benutzen von COM-Objekten
 
Zum Aufrufen eines COM-Objekts muss zunächst
eine Proxyklasse (oder Wrapperklasse) definiert werden, mit der die Funktionen des COM-Objekts
festgelegt werden, zusammen mit zusätzlichen Informationen. Dies
ist eine recht mühselige Aufgabe, die in den meisten Fällen
durch Einsatz des Dienstprogramms tlbimp umgangen werden
kann. Dieses Dienstprogramm liest die COM-Typbibliotheksinformationen und erstellt
anschließend die Proxyklasse. Dies funktioniert in den meisten Fällen,
wenn jedoch eine erweiterte Marshalingsteuerung erforderlich ist, kann die Proxyklasse manuell
erstellt werden. In diesem Fall wird über Attribute festgelegt,
wie das Marshaling durchgeführt werden soll.
Nachdem die Proxyklasse erstellt wurde, wird diese
wie jede andere .NET-Klasse eingesetzt, und die Laufzeitumgebung übernimmt
die niederen Arbeiten.
30.2 Von COM-Objekten benutzt werden
 
Die Laufzeitumgebung ermöglicht das Verwenden
von .NET-Objekten anstelle von COM-Objekten. Das Dienstprogramm tlbexp
wird zum Erstellen einer Typbibliothek verwendet, mit der die COM-Objekte
beschrieben werden, damit andere COM-basierte Programme die Objektschnittstelle
identifizieren können. Das Dienstprogramm regasm wird
zum Registrieren einer Assemblierung eingesetzt, damit auf diese über COM zugegriffen
werden kann. Wenn COM auf eine .NET-Klasse zugreift, übernimmt
die Laufzeitumgebung das Erstellen des .NET-Objekts, erstellt die benötigten
COM-Schnittstellen und führt ein Marshaling der Daten zwischen
der .NET- und der COM-Umgebung durch.
30.3 Aufrufen systemeigener DLL-Funktionen
 
C# kann über den so genannten »Plattformaufruf« in systemeigenem Code geschriebene Funktionen
aufrufen. Die Datei, in der sich die Funktion befindet, wird über
das Attribut sysimport angegeben, das auch zum Spezifizieren
des Standardzeichenmarshalings verwendet werden kann. In vielen Fällen reicht
dieses Attribut aus, wenn jedoch ein Wert als Verweis übergeben
wird, kann über die Attribute in und out festgelegt
werden, wie der Wert übergeben werden soll.
class Test
{
[sysimport(dll="user32.dll")]
public static extern int MessageBoxA(int h, string m,
string c, int type);
public static void Main()
{
int retval = MessageBoxA(0, "Hello", "Caption", 0);
}
}
Bei der Ausführung dieses Codeabschnitts wird
ein Meldungsfeld angezeigt.
|