Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung...
Transcript of Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung...
Technische Universität München
.Net Interoperabilität
Objektorientiertes Programmieren mit .NET und C#
Thomas Hörmann
Institut für Informatik
Software & Systems Engineering
Technische Universität München
06.02.2013 Thomas Hörmann .Net InterOP 2
Agenda
Einleitung
P/Invoke
Marshalling
Component Object Model (COM)
Fazit
Technische Universität München
Wieso Interop?
Zugriff auf Betriebssystem Funktionen
Bibliotheken Dritter verwenden
Legacy Code verwenden
Beispiele:
– Windows 7 Glass
– Windows Taskleiste
– GTK
– Hochperformanter nativer Code
06.02.2013 3Thomas Hörmann .Net InterOP
Technische Universität München
Überblick
06.02.2013 4Thomas Hörmann .Net InterOP
Technische Universität München
P/Invoke
06.02.2013 5Thomas Hörmann .Net InterOP
Technische Universität München
DllImport
[DllImport("user32")]
public extern static int MessageBox(
int hwnd, String m, String c, int flags);
[DllImport("user32.dll",
EntryPoint="MessageBoxW",
CallingConvention=CallingConvention.StdCall,
ExactSpelling=true)]
public extern static uint MessageBox2(
IntPtr hwnd, String m, String c, uint flags);
06.02.2013 6Thomas Hörmann .Net InterOP
Technische Universität München
Fehlerquellen
DllNotFoundException
EntryPointNotFoundException
PInvokeStackInvallanceException
AccessViolationException
DivisionByZeroException
06.02.2013 7Thomas Hörmann .Net InterOP
Technische Universität München
Marshalling
06.02.2013 8Thomas Hörmann .Net InterOP
Technische Universität München
Werttypen
Typ Bereich Größe
sbyte -128 bis 127 Ganze 8-Bit-Zahl
byte 0 bis 255 Ganze 8-Bit-Zahl
char U+0000 bis U+ffff 16-Bit-Unicode-Zeichen
short -32.768 bis 32.767 Ganze 16-Bit-Zahl
ushort 0 bis 65.535 Ganze 16-Bit-Zahl
int -2.147.483.648 bis 2.147.483.647
Ganze 32-Bit-Zahl
uint 0 bis 4.294.967.295 Vorzeichenlose 32-Bit-Ganzzahl
long -9 * 10^18 bis 9 * 10^18 64-Bit-Ganzzahl
ulong 0 bis 18 * 10^18 Vorzeichenlose 64-Bit-Ganzzahl
06.02.2013 9Thomas Hörmann .Net InterOP
Technische Universität München
MarshalAs
[DllImport("someDll.dll")]
public static extern void DoIt(
[MarshalAs(UnmanagedType.Bool)] int i1,
[MarshalAs(UnmanagedType.U4)] int i2,
[MarshalAs(UnmanagedType.LPStr)] String s1);
06.02.2013 10Thomas Hörmann .Net InterOP
Technische Universität München
Arrays
[DllImport("someDll.dll")]
public static extern void doArray(POINT[] myArray);
06.02.2013 11Thomas Hörmann .Net InterOP
Technische Universität München
Strings
[DllImport("someDll.dll")]
public static extern void doString(String myString);
06.02.2013 12Thomas Hörmann .Net InterOP
Technische Universität München
Strings (2)
Probleme mit Strings:
Strings sind nicht veränderbare Objekte
Zeichenkodierung
Lösung:
StringBuilder
Char Array
MarshalAs
CharSet
[DllImport("user32.dll", CharSet = CharSet.Ansi)]
public extern static uint MessageBoxA(
int hwnd, String m, String c, uint flags);
06.02.2013 13Thomas Hörmann .Net InterOP
Technische Universität München
Strukturen
[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
public int X;
public int Y;
}
[DllImport("someDll.dll")]
public static extern void doStruct(POINT p);
Strukturen sind Werttypen
X und Y kommen auf den Stack
06.02.2013 14Thomas Hörmann .Net InterOP
Technische Universität München
Strukturen
[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
public int X;
public int Y;
}
[DllImport("someDll.dll")]
public static extern void doStruct(POINT p);
[DllImport("someDll.dll")]
public static extern void doStruct(int X, int Y);
06.02.2013 15Thomas Hörmann .Net InterOP
Technische Universität München
Klassen
[StructLayout(LayoutKind.Sequential)]
public class Point
{
public int X;
public int Y;
}
[DllImport("someDll.dll")]
public static extern void doStructRef(Point p);
[DllImport("someDll.dll")]
public static extern void doStructRef(ref POINT p);
06.02.2013 16Thomas Hörmann .Net InterOP
Technische Universität München
MarshalByRef
[DllImport("dwmapi.dll", PreserveSig = false)]
public static extern void DwmExtendFrameIntoClientArea
(IntPtr hwnd, ref MARGINS margins);
Fenster
Thread Handling (Timer, Mutex)
IO Streams
Datenbank Verbindungen
06.02.2013 17Thomas Hörmann .Net InterOP
Technische Universität München
Funktionspointer
[StructLayout(LayoutKind.Sequential)]
public class Point
{
public int X;
public int Y;
public void add(int X, int Y)
{
this.X += X;
this.Y += Y;
}
}
06.02.2013 18Thomas Hörmann .Net InterOP
Technische Universität München
Funktionspointer (2)
public delegate void addPoint(int X, int Y);
[DllImport("someDll.dll")]
public static extern void sendPointer(addPoint myDelegate);
static void Main()
{
Point myPoint = new Point();
addPoint myDelegate = myPoint.add;
sendPointer(myDelegate);
}
06.02.2013 19Thomas Hörmann .Net InterOP
Technische Universität München
Component Object Model
06.02.2013 20Thomas Hörmann .Net InterOP
Technische Universität München
Component Object Model
06.02.2013 21Thomas Hörmann .Net InterOP
IUnknownIDispatch
Technische Universität München
Beispiel
06.02.2013 22Thomas Hörmann .Net InterOP
Technische Universität München
Fazit
+ Einfacher Zugriff auf externe Bibliotheken
+ Einheitliche Schnittstelle
+ Volle Kontrolle über verwalteten Heap
+ Verwaltung von COM Objekten
- Keine Optimierung zur Laufzeit möglich
- Schlechte Laufzeit bei vielen Zugriffen
- Benötigt mehr Speicher
- Eingeschränkter Zugriff von außen
06.02.2013 23Thomas Hörmann .Net InterOP
Technische Universität München
Vielen Dank für Ihre
Aufmerksamkeit
06.02.2013 24Thomas Hörmann .Net InterOP