3 interop part2
TRANSCRIPT
Interoperation, Teil 2
C# Workshop TU DarmstadtQiong Wu – Microsoft Student Partner
Tlbimp vs. Manueller Import Tlbimp generiert einen COM to .net Wrapper
COM CoClasses werden zu C# Klassen mit parameterlosem Konstruktor konvertiert
COM structs werden zu C# structs mit public fields konvertiert
Tlbimp kann nicht verwendet werden wenn Keine Typelib vorhanden ist Tlbimp Definitionen nicht verarbeiten kann
Alternativer Ansatz Manueller Import
Manueller Import - AttributeComImport – Markiert eine Klasse als
extern implementierte COM Klasse.Guid – Setzt den universally unique
identifier (UUID) für eine Klasse oder ein Interface
InterfaceType – Legt fest ob ein Interface von IDispatch oder IUnknown erbt
PreserveSig – Legt fest ob ein nativer Rückgabewert von einem HRESULT zu einer .net Exception umgewandelt werden soll
Manueller Import – COM CoClass
CoClass als Klasse deklarieren Darf von keiner anderen Klasse erben Darf keine Interfaces implementieren GUID Attribut setzen
Instanziieren mit new Schlüsselwort C# Äquivalent zu CoCreateInstance Parameterloser Konstruktor
Manueller Import – COM Interface
C# Interface erstellen mit Attributen COMImport GUID
Muss Interface Member Funktionen in der exakten COM interface Reihenfolge enthalten
Ggf. Standard Marshalling mit MarshalAs überschreiben
Exception Mapping zwischen COM & .net festlegen
CoClasses & Interfaces in .net verwenden
CoClass instanziieren Entsprechendes Interface casten
Marshalling
Standardmarshalling konvertiert Datentypen von COM in .net & vice versa
Anpassung von Marshalling ist ggf. notwendig
Verwenden von MarshalAs um Marshalling anzupassen
Unmanaged Events
COM Events werden wie C# Events behandelt
Events nach COM auslösen von C# aus
Customize Wrappers
RCW Erstellen RCW
Disassemblieren
Source anpassen
RCW Neu kompilieren
Links
.net Reflector http://www.red-gate.com/products/
reflector/ Windows SDK
http://msdn.microsoft.com/de-de/windows/dd146047(en-us).aspx