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 Report

Transcript 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