Interoperabilität Microsoft .NET und COM+ Dariusz Parys Developer Group Microsoft GmbH Email: [email protected] Agenda Warum Interoperabilität? Integration mit COM Nutzung von COM+ Diensten API Aufrufe in native Win32 DLL’s Microsoft.
Download ReportTranscript Interoperabilität Microsoft .NET und COM+ Dariusz Parys Developer Group Microsoft GmbH Email: [email protected] Agenda Warum Interoperabilität? Integration mit COM Nutzung von COM+ Diensten API Aufrufe in native Win32 DLL’s Microsoft.
Interoperabilität Microsoft .NET und COM+ Dariusz Parys Developer Group Microsoft GmbH Email: [email protected] Agenda Warum Interoperabilität? Integration mit COM Nutzung von COM+ Diensten API Aufrufe in native Win32 DLL’s Microsoft .NET und COM+ 2 Warum Interoperabilität? Sicherung der Investitionen • • Bestehende Funktionalität nutzen und diese Erweitern • • Entwicklungskosten Stabilität der Software 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+ 3 Unterschiede .NET - COM .NET Framework Typen Standard Metadaten Interface basierend New operator Cast operator Exceptions Managed Object Lifetime Strong Names Microsoft .NET und COM+ COM / DLL Modell Binärer Standard Typbibliotheken Objekt basierend CoCreateInstance QueryInterface HResults Referenzzähler GUIDS 4 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+ 5 COM Objekte aus .NET nutzen Microsoft .NET und COM+ 6 Drei Schritte zu COM Referenzieren eines Interop Assemblies Instanzieren des Typen mit „new“ Nutzung der Funktionalität Microsoft .NET und COM+ 7 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+ 8 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+ 9 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+ 10 COM Objekt aus .NET Reference Counted Traced Reference Client Managed Microsoft .NET und COM+ Runtime Callable Wrapper IUnknown ? IFoo COM Objekt Unmanaged 11 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+ 12 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+ 13 Demo COM Objekt in .NET nutzen Microsoft .NET und COM+ 14 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+ 15 .NET Objekte aus COM nutzen Microsoft .NET und COM+ 16 Drei Schritte zu .NET Erstellen einer Typenbibliothek Instanzieren des Objektes • • CoCreateInstance Oder “new” in VB6 Nutzung der Funktionalität Microsoft .NET und COM+ 17 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+ 18 COM Objekt aus .NET Traced Reference Reference Counted IUnknown Client Unmanaged Microsoft .NET und COM+ IFoo COM Callable Wrapper ? .NET Objekt Managed 19 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+ 20 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+ 21 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+ 22 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+ 23 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+ 24 Parameter Umsetzung COM Method Signature HRESULT FormatDate(BSTR s, DATE d, [out, retval] int *retval); int FormatDate(String s, DateTime d); .NET Method Signature Microsoft .NET und COM+ 25 Datentypen Umwandlung DATE BSTR Safearray( int ) OLECOLOR CURRENCY Variant Interface Foo Coclass Foo Microsoft .NET und COM+ System.DateTime System.String Int[] System.Drawing.Color System.Decimal System.Object Interface Foo Class Foo 26 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+ 27 Blittable Typen System.Byte, System.SByte System.Int16, System.UInt16 System.Int32, System.UInt32 System.Int64 System.IntPtr, System.UIntPtr Microsoft .NET und COM+ 28 Nicht Blittable Typen System.Array System.Boolean System.Char System.Class System.Object System.String System.ValueType Microsoft .NET und COM+ C-Style Array oder SafeArray 1, 2 oder 4 Byte mit 1 oder -1 Unicode oder Ansi Klasseninterface Variant oder Klasseninterface Nullterminierter String oder BSTR Struktur 29 Demo Nutzung von .NET Objekten aus COM Microsoft .NET und COM+ 30 COM+ Dienste in .NET Microsoft .NET und COM+ 31 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+ 32 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+ 33 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+ 34 Demo Object Pooling mit .NET Microsoft .NET und COM+ 35 In Win32 DLL’s reinrufen Microsoft .NET und COM+ 36 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+ 37 Platform Invoke Beispiel #1 public class Win32API { [DllImport(“User32.dll”,EntryPoint=“MessageB ox”)] public static extern Boolean MsgBox(…); } Microsoft .NET und COM+ 39 Platform Invoke Beispiel #2 [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); } Microsoft .NET und COM+ 40 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+ 41 Demo Aufrufe mit P/Invoke Microsoft .NET und COM+ 42 Wie sieht es mit Performance aus? Umwandlungen haben Overhead • Daten Marshaling verursacht ebenfalls Overhead • • Ca. 30 Instruktionen pro Aufruf 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+ 43 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+ 44 Links und Ressourcen So bringen Sie COM und .NET in Einklang • http://www.microsoft.com/germany/ms/ms dnbiblio/show_all.asp?siteid=500418 Microsoft .NET / COM Migration and Interoperability • http://msdn.microsoft.com/library/enus/dnbda/html/cominterop.asp Microsoft .NET und COM+ 45 Fragen!? Uff... Microsoft .NET und COM+ 46