45
Dariusz Parys Developer Group Microsoft GmbH Email: [email protected] Interoperabilität Interoperabilität Microsoft .NET und COM+

Dariusz Parys Developer Group Microsoft GmbH Email: [email protected] Interoperabilität Microsoft.NET und COM+

Embed Size (px)

Citation preview

Page 1: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

Dariusz ParysDeveloper GroupMicrosoft GmbH

Email: [email protected]

InteroperabilitätInteroperabilität

Microsoft .NET und COM+

Page 2: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilitä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

Page 3: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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

Page 4: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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

Page 5: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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

Page 6: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

Microsoft .NET und COM+ 6

COM Objekte aus .NET nutzenCOM Objekte aus .NET nutzen

Page 7: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

Microsoft .NET und COM+ 7

Drei Schritte zu COM

Referenzieren eines Interop Assemblies Instanzieren des Typen mit „new“ Nutzung der Funktionalität

Page 8: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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

Page 9: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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

Page 10: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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

Page 11: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

Microsoft .NET und COM+ 11

COM Objekt aus .NET

Managed Unmanaged

Client COM Objekt

IUnknown

IFoo?RuntimeCallableWrapper

TracedReference

ReferenceCounted

Page 12: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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

Page 13: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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

Page 14: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

Microsoft .NET und COM+ 14

Demo

COM Objekt in .NET nutzen

COM Objekt in .NET nutzen

Page 15: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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

Page 16: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

Microsoft .NET und COM+ 16

.NET Objekte aus COM nutzen.NET Objekte aus COM nutzen

Page 17: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

Microsoft .NET und COM+ 17

Drei Schritte zu .NET

Erstellen einer Typenbibliothek Instanzieren des Objektes

• CoCreateInstance

• Oder “new” in VB6

Nutzung der Funktionalität

Page 18: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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

Page 19: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

Microsoft .NET und COM+ 19

COM Objekt aus .NET

Unmanaged Managed

Client .NET ObjektIUnknown

IFoo ?COM

CallableWrapper

TracedReference

ReferenceCounted

Page 20: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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

Page 21: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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

Page 22: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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

Page 23: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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

Page 24: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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

Page 25: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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

Page 26: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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

Page 27: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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

Page 28: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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

Page 29: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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

Page 30: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

Microsoft .NET und COM+ 30

Demo

Nutzung von .NET Objekten aus COM

Nutzung von .NET Objekten aus COM

Page 31: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

Microsoft .NET und COM+ 31

COM+ Dienste in .NETCOM+ Dienste in .NET

Page 32: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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

Page 33: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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! } }}

Page 34: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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() {} }}

Page 35: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

Microsoft .NET und COM+ 35

Demo

Object Pooling mit .NETObject Pooling mit .NET

Page 36: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

Microsoft .NET und COM+ 36

In Win32 DLL’s reinrufenIn Win32 DLL’s reinrufen

Page 37: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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

Page 38: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

Microsoft .NET und COM+ 39

Platform Invoke Beispiel #1

public class Win32API

{

[DllImport(“User32.dll”,EntryPoint=“MessageBox”)]

public static extern Boolean MsgBox(…);

}

Page 39: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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);

}

Page 40: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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 );

Page 41: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

Microsoft .NET und COM+ 42

Demo

Aufrufe mit P/InvokeAufrufe mit P/Invoke

Page 42: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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?

Page 43: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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

Page 44: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

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

Page 45: Dariusz Parys Developer Group Microsoft GmbH Email: dparys@microsoft.com Interoperabilität Microsoft.NET und COM+

Microsoft .NET und COM+ 46

Fragen!?

Uff...Uff...