Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+
Post on 05-Apr-2015
105 Views
Preview:
Transcript
Dariusz ParysDeveloper GroupMicrosoft GmbH
Email: dparys@microsoft.com
InteroperabilitätInteroperabilität
Microsoft .NET und COM+
Microsoft .NET und COM+ 2
Agenda
Warum Interoperabilität? Integration mit COM Nutzung von COM+ Diensten API Aufrufe in native Win32 DLL’s
Microsoft .NET und COM+ 3
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+ 4
Unterschiede .NET - 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
Microsoft .NET und COM+ 5
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+ 6
COM Objekte aus .NET nutzenCOM Objekte aus .NET nutzen
Microsoft .NET und COM+ 7
Drei Schritte zu COM
Referenzieren eines Interop Assemblies Instanzieren des Typen mit „new“ Nutzung der Funktionalität
Microsoft .NET und COM+ 8
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+ 9
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+ 10
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+ 11
COM Objekt aus .NET
Managed Unmanaged
Client COM Objekt
IUnknown
IFoo?RuntimeCallableWrapper
TracedReference
ReferenceCounted
Microsoft .NET und COM+ 12
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+ 13
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+ 14
Demo
COM Objekt in .NET nutzen
COM Objekt in .NET nutzen
Microsoft .NET und COM+ 15
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+ 16
.NET Objekte aus COM nutzen.NET Objekte aus COM nutzen
Microsoft .NET und COM+ 17
Drei Schritte zu .NET
Erstellen einer Typenbibliothek Instanzieren des Objektes
• CoCreateInstance
• Oder “new” in VB6
Nutzung der Funktionalität
Microsoft .NET und COM+ 18
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+ 19
COM Objekt aus .NET
Unmanaged Managed
Client .NET ObjektIUnknown
IFoo ?COM
CallableWrapper
TracedReference
ReferenceCounted
Microsoft .NET und COM+ 20
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+ 21
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+ 22
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+ 23
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+ 24
Interop Attribute
Using System.Runtime.InteropServices
[Guid(…), InterfaceType(ComInterfaceType.IsIUnknown)]
Interface IFooBar {
[DispId(64)] int Format( [MarshalAs(LPStr)] String s)
}
Mit Interop Attributen* kann man beim Export Mit Interop Attributen* kann man beim Export die Umsetzung auf COM Typen Definitionen die Umsetzung auf COM Typen Definitionen beeinflußen. Dies gilt für Typen, Methoden, beeinflußen. Dies gilt für Typen, Methoden, Eigenschaften, Felder oder Parameter.Eigenschaften, Felder oder Parameter.
* Attribute werden nicht nur für Interop genutzt* Attribute werden nicht nur für Interop genutzt
Microsoft .NET und COM+ 25
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+ 26
Datentypen Umwandlung
DATE System.DateTimeBSTR System.StringSafearray( int ) Int[]OLECOLOR System.Drawing.ColorCURRENCY System.DecimalVariant System.ObjectInterface Foo Interface FooCoclass Foo Class Foo
Microsoft .NET und COM+ 27
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+ 28
Blittable Typen
System.Byte, System.SByte System.Int16, System.UInt16 System.Int32, System.UInt32 System.Int64 System.IntPtr, System.UIntPtr
Microsoft .NET und COM+ 29
Nicht Blittable Typen
System.Array C-Style Array oder SafeArray
System.Boolean 1, 2 oder 4 Byte mit 1 oder -1
System.Char Unicode oder AnsiSystem.Class KlasseninterfaceSystem.Object Variant oder
KlasseninterfaceSystem.String Nullterminierter String
oder BSTRSystem.ValueType Struktur
Microsoft .NET und COM+ 30
Demo
Nutzung von .NET Objekten aus COM
Nutzung von .NET Objekten aus COM
Microsoft .NET und COM+ 31
COM+ Dienste in .NETCOM+ Dienste in .NET
Microsoft .NET und COM+ 32
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+ 33
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+ 34
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+ 35
Demo
Object Pooling mit .NETObject Pooling mit .NET
Microsoft .NET und COM+ 36
In Win32 DLL’s reinrufenIn Win32 DLL’s reinrufen
Microsoft .NET und COM+ 37
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+ 39
Platform Invoke Beispiel #1
public class Win32API
{
[DllImport(“User32.dll”,EntryPoint=“MessageBox”)]
public static extern Boolean MsgBox(…);
}
Microsoft .NET und COM+ 40
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+ 41
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+ 42
Demo
Aufrufe mit P/InvokeAufrufe mit P/Invoke
Microsoft .NET und COM+ 43
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+ 44
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+ 45
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/dn
bda/html/cominterop.asp
Microsoft .NET und COM+ 46
Fragen!?
Uff...Uff...
top related