450 likes | 588 Views
Interoperabilität. Microsoft .NET und COM+. Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com. Agenda. Warum Interoperabilität? Integration mit COM Nutzung von COM+ Diensten API Aufrufe in native Win32 DLL’s. Warum Interoperabilität?. Sicherung der Investitionen
E N D
Interoperabilität Microsoft .NET und COM+ Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com
Agenda • Warum Interoperabilität? • Integration mit COM • Nutzung von COM+ Diensten • API Aufrufe in native Win32 DLL’s Microsoft .NET und COM+
Warum Interoperabilität? • Sicherung der Investitionen • Entwicklungskosten • Stabilität der Software • Bestehende Funktionalität nutzen und diese Erweitern • Zeitgewinn • Mehrwert durch neue Möglichkeiten • Langsames Ersetzen der Software • Migration: Schritt für Schritt • Manchmal hat man keine andere Wahl Microsoft .NET und COM+
.NET Framework Typen Standard Metadaten Interface basierend New operator Cast operator Exceptions Managed Object Lifetime Strong Names COM / DLL Modell Binärer Standard Typbibliotheken Objekt basierend CoCreateInstance QueryInterface HResults Referenzzähler GUIDS Unterschiede .NET - COM Microsoft .NET und COM+
Interop Möglichkeiten • COM Interop • COM Objekte aus der .NET Welt nutzen • .NET Objekte aus der COM Welt nutzen • COM+ Dienste in .NET nutzen • Platform Invoke Service (PInvoke) • Native Win32 API Aufrufe aus .NET heraus Microsoft .NET und COM+
COM Objekte aus .NET nutzen Microsoft .NET und COM+
Drei Schritte zu COM • Referenzieren eines Interop Assemblies • Instanzieren des Typen mit „new“ • Nutzung der Funktionalität Microsoft .NET und COM+
Was ist ein Interop Assembly? • Enthält keinerlei ausführbaren Code • Nur Typendefinitionen die im COM Objekt implementiert sind • Grundlage für den RCW zur Laufzeit um die Typen zu binden • Grundlage für das Marshaling der Daten zwischen beiden Welten Microsoft .NET und COM+
Woher bekomme ich ein Interop Assembly? • Vorzugsweise vom „Hersteller“ • PIA (Primary Interop Assembly) • In VS .NET durch „Add References...“ • Mit Hilfe des Tools • TLBIMP.EXE Microsoft .NET und COM+
Interop Assemblies • Interop Assemblies müssen zur Laufzeit verfügbar sein • Der Assembly Loader muß diese finden • Installation ins Applikationsverzeichnis • Einfaches XCOPY • Oder Installation in den Global Assembly Cache • Strong Name für Assembly (SN) • Installation mit GACUTIL Microsoft .NET und COM+
? COM Objekt aus .NET Managed Unmanaged Reference Counted Traced Reference COM Objekt Client Runtime Callable Wrapper IUnknown IFoo Microsoft .NET und COM+
Runtime Callable Wrapper • Proxy Objekt der Runtime • Pro COM Objekt Instanz ein RCW • Handhabt das Marshaling der Daten • Verbirgt COM spezifische Aufrufe • Bestimmte Interfaces wie IUnknown, IDispatch, etc… • Stellt jedoch Interfaces des Objektes .NET zur Verfügung Microsoft .NET und COM+
RCW bietet Transparenz • Kein Referenzzähler • Keine GUID • Keine HRESULT, Fehler werden als Exception geworfen • Kein QueryInterface, einfach ein cast auf das entsprechende Interface • InvalidCastException <-> E_NOINTERFACE Microsoft .NET und COM+
Demo COM Objekt in .NET nutzen Microsoft .NET und COM+
Denkanstöße • Ziel von COM Interop ist es existierende Funktionalität zu nutzen • Kein Ersatz für richtige “managed” Objekte • Keine Konstruktoren • Keine Vererbung • Kein Überladen von Funmktionen • Keine statischen Funktionen • Überlegung RCW’s zu wrappen Microsoft .NET und COM+
.NET Objekte aus COM nutzen Microsoft .NET und COM+
Drei Schritte zu .NET • Erstellen einer Typenbibliothek • Instanzieren des Objektes • CoCreateInstance • Oder “new” in VB6 • Nutzung der Funktionalität Microsoft .NET und COM+
Wie erstelle ich die Typenbibliothek? • Mit Visual Studio .NET • Einstellung in den Projektproperties • “Register for COM Interoperability” • Manuell • Mit TLBEXP.EXE und REGASM.EXE Microsoft .NET und COM+
IUnknown ? IFoo COM Objekt aus .NET Unmanaged Managed Traced Reference Reference Counted .NET Objekt Client COM Callable Wrapper Microsoft .NET und COM+
COM Callable Wrapper • Proxy für COM Clients um auf Managed Code zuzugreifen • Pro .NET Objekt Instanz ein CCW • Handhabt das Marshaling der Daten • Simuliert COM Interfaces wie IUnknown, IDispatch, etc… • Verwendung von Klasseninterface per Attribute Microsoft .NET und COM+
Design für Interoperabilität • Einschränkungen • Nur öffentlich Typen sind Sichtbar • Nur öffentliche Funktionen/Props sind sichtbar • Shared/Static Member sind nicht erreichbar • Überladene Funktionen haben andere Namen • Benötigen einen public default Konstruktor • Tips • Funktionalität durch Interfaces verfügbar machen • Custom Attributes um Marshaling zu beeinflußen Microsoft .NET und COM+
Nützliche Informationen (1/2) • Klasseninterface kann automatisch erzeugt werden • In VB: Benutzung des ComClass Attributes • In C#: Benutzung des ClassInterfaceType Attributes • GUID’s werden beim Export automatisch erstellt • Basierend auf Assembly und Typenbezeichnung • Basierend auf kompletter Interfacebeschreibung Microsoft .NET und COM+
Nützliche Informationen (2/2) • Assembly muß zur Laufzeit aufgelöst werden können • Wird nicht über InProcServer32 aufgelöst • Assemblies liegen im Applikationsverzeichnis • Oder sind im Global Assembly Cache installiert Microsoft .NET und COM+
Interop Attribute Mit Interop Attributen* kann man beim Export die Umsetzung auf COM Typen Definitionen beeinflußen. Dies gilt für Typen, Methoden, Eigenschaften, Felder oder Parameter. Using System.Runtime.InteropServices [Guid(…), InterfaceType(ComInterfaceType.IsIUnknown)] Interface IFooBar { [DispId(64)] int Format( [MarshalAs(LPStr)] String s) } * Attribute werden nicht nur für Interop genutzt Microsoft .NET und COM+
COM Method Signature HRESULT FormatDate(BSTR s, DATE d, [out, retval] int *retval); int FormatDate(String s, DateTime d); .NET Method Signature Parameter Umsetzung Microsoft .NET und COM+
Datentypen Umwandlung Microsoft .NET und COM+
Mehr Marshaling… • Blittable Datentypen werden direkt übergeben • z.B. Byte, Short, Integer, Long, Single, Double • Einige Typen brauchen besondere Handhabung • z.B. BOOLEAN: 2 oder 4 byte value, Wert True 1 oder -1 Microsoft .NET und COM+
Blittable Typen • System.Byte, System.SByte • System.Int16, System.UInt16 • System.Int32, System.UInt32 • System.Int64 • System.IntPtr, System.UIntPtr Microsoft .NET und COM+
Nicht Blittable Typen Microsoft .NET und COM+
Demo Nutzung von .NET Objekten aus COM Microsoft .NET und COM+
COM+ Dienste in .NET Microsoft .NET und COM+
Was ist zu tun? • Namespace: System.EnterpriseServices • Beinhaltet eine Vielzahl Attribute und Objekte • Eigene Klasse ableiten von ServicedComponent • Eventuell überschreiben der COM+ spezifischen Methoden • Mit Attributen die entsprechenden Services definieren Microsoft .NET und COM+
Beispiel 1: ObjectPooling Namespace Beispiel1{[ ObjectPooling( 5, 20 ) ] public class PooledKlasse : ServicedComponent { public PooledKlasse() {} // Überschreiben von CanBePooled protected override bool CanBePooled() { return true; // Notwendig damit Reused wird! } }} Microsoft .NET und COM+
Beispiel 2: Transaktionen Using System.EnterpriseServices;[ assembly: ApplicationName( “MeineApplikation” ) ][ assembly: ApplicationActivation( ActivationOption.Library ) ]Namespace Beispiel2{ [ Transaction( TransactionOption.Required ) ] public class TransaktionsKlasse : ServicedComponent { public TransaktionsKlasse() {} }} Microsoft .NET und COM+
Demo Object Pooling mit .NET Microsoft .NET und COM+
In Win32 DLL’s reinrufen Microsoft .NET und COM+
Platform Invoke (P/Invoke) • Zugriff auf statische Einstiegspunkte von nativen DLL’s • Ähnlich: • Declare statement aus VB 6 • Load library / GetProcAddress • Methoden Definitionen müssen mit Custom Attributes zur Verfügung gestellt werden • Benutzt ebenfalls den COM Interop Marshaling Service Microsoft .NET und COM+
public class Win32API { [DllImport(“User32.dll”,EntryPoint=“MessageBox”)] public static extern Boolean MsgBox(…); } Platform Invoke Beispiel #1 Microsoft .NET und COM+
[StructLayout(LayoutKind.Sequential)] Public struct OSInfo ( uint MajorVersion; uint MinorVersion; String VersionString; } public class Win32API { [DllImport(“User32.dll”)] public static extern Boolean GetVersionEx(OSInfo osi); } Platform Invoke Beispiel #2 Microsoft .NET und COM+
String vs. Stringbuilder • System.String • Strings sind nicht veränderbar • System.Text.StringBuilder • Aufruf von API’s die einen Buffer erwarten, die StringBuilder Klasse einsetzen [C#] uint sz = 256;StringBuilder sb = new StringBuilder( ( int ) sz );GetUserName( sb, ref sz ); Microsoft .NET und COM+
Demo Aufrufe mit P/Invoke Microsoft .NET und COM+
Wie sieht es mit Performance aus? • Umwandlungen haben Overhead • Ca. 30 Instruktionen pro Aufruf • Daten Marshaling verursacht ebenfalls Overhead • Abhängig von Typ und Größe • Blittable Typen direkt • Gezielt nutzen • Nur aufrufen wenn es sein muß • Alternativen in Betracht ziehen • Kann man den Code vielleicht doch migrieren? Microsoft .NET und COM+
Zusammenfassung • Interop Services ermöglichen Nutzung bestehender und zukünftiger Funktionalität in beiden Welten • Interop kann bei der Migration behilflich sein • Nutzung der COM+ basierten Dienste für .NET Objekte Microsoft .NET und COM+
Links und Ressourcen • So bringen Sie COM und .NET in Einklang • http://www.microsoft.com/germany/ms/msdnbiblio/show_all.asp?siteid=500418 • Microsoft .NET / COM Migration and Interoperability • http://msdn.microsoft.com/library/en-us/dnbda/html/cominterop.asp Microsoft .NET und COM+
Uff... Fragen!? Microsoft .NET und COM+