Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung...

24
Technische Universität München .Net Interoperabilität Objektorientiertes Programmieren mit .NET und C# Thomas Hörmann Institut für Informatik Software & Systems Engineering

Transcript of Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung...

Page 1: Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung Lösung: StringBuilder Char Array MarshalAs CharSet [DllImport("user32.dll", CharSet

Technische Universität München

.Net Interoperabilität

Objektorientiertes Programmieren mit .NET und C#

Thomas Hörmann

Institut für Informatik

Software & Systems Engineering

Page 2: Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung Lösung: StringBuilder Char Array MarshalAs CharSet [DllImport("user32.dll", CharSet

Technische Universität München

06.02.2013 Thomas Hörmann .Net InterOP 2

Agenda

Einleitung

P/Invoke

Marshalling

Component Object Model (COM)

Fazit

Page 3: Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung Lösung: StringBuilder Char Array MarshalAs CharSet [DllImport("user32.dll", CharSet

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

Page 4: Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung Lösung: StringBuilder Char Array MarshalAs CharSet [DllImport("user32.dll", CharSet

Technische Universität München

Überblick

06.02.2013 4Thomas Hörmann .Net InterOP

Page 5: Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung Lösung: StringBuilder Char Array MarshalAs CharSet [DllImport("user32.dll", CharSet

Technische Universität München

P/Invoke

06.02.2013 5Thomas Hörmann .Net InterOP

Page 6: Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung Lösung: StringBuilder Char Array MarshalAs CharSet [DllImport("user32.dll", CharSet

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

Page 7: Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung Lösung: StringBuilder Char Array MarshalAs CharSet [DllImport("user32.dll", CharSet

Technische Universität München

Fehlerquellen

DllNotFoundException

EntryPointNotFoundException

PInvokeStackInvallanceException

AccessViolationException

DivisionByZeroException

06.02.2013 7Thomas Hörmann .Net InterOP

Page 8: Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung Lösung: StringBuilder Char Array MarshalAs CharSet [DllImport("user32.dll", CharSet

Technische Universität München

Marshalling

06.02.2013 8Thomas Hörmann .Net InterOP

Page 9: Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung Lösung: StringBuilder Char Array MarshalAs CharSet [DllImport("user32.dll", CharSet

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

Page 10: Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung Lösung: StringBuilder Char Array MarshalAs CharSet [DllImport("user32.dll", CharSet

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

Page 11: Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung Lösung: StringBuilder Char Array MarshalAs CharSet [DllImport("user32.dll", CharSet

Technische Universität München

Arrays

[DllImport("someDll.dll")]

public static extern void doArray(POINT[] myArray);

06.02.2013 11Thomas Hörmann .Net InterOP

Page 12: Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung Lösung: StringBuilder Char Array MarshalAs CharSet [DllImport("user32.dll", CharSet

Technische Universität München

Strings

[DllImport("someDll.dll")]

public static extern void doString(String myString);

06.02.2013 12Thomas Hörmann .Net InterOP

Page 13: Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung Lösung: StringBuilder Char Array MarshalAs CharSet [DllImport("user32.dll", CharSet

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

Page 14: Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung Lösung: StringBuilder Char Array MarshalAs CharSet [DllImport("user32.dll", CharSet

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

Page 15: Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung Lösung: StringBuilder Char Array MarshalAs CharSet [DllImport("user32.dll", CharSet

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

Page 16: Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung Lösung: StringBuilder Char Array MarshalAs CharSet [DllImport("user32.dll", CharSet

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

Page 17: Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung Lösung: StringBuilder Char Array MarshalAs CharSet [DllImport("user32.dll", CharSet

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

Page 18: Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung Lösung: StringBuilder Char Array MarshalAs CharSet [DllImport("user32.dll", CharSet

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

Page 19: Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung Lösung: StringBuilder Char Array MarshalAs CharSet [DllImport("user32.dll", CharSet

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

Page 20: Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung Lösung: StringBuilder Char Array MarshalAs CharSet [DllImport("user32.dll", CharSet

Technische Universität München

Component Object Model

06.02.2013 20Thomas Hörmann .Net InterOP

Page 21: Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung Lösung: StringBuilder Char Array MarshalAs CharSet [DllImport("user32.dll", CharSet

Technische Universität München

Component Object Model

06.02.2013 21Thomas Hörmann .Net InterOP

IUnknownIDispatch

Page 22: Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung Lösung: StringBuilder Char Array MarshalAs CharSet [DllImport("user32.dll", CharSet

Technische Universität München

Beispiel

06.02.2013 22Thomas Hörmann .Net InterOP

Page 23: Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung Lösung: StringBuilder Char Array MarshalAs CharSet [DllImport("user32.dll", CharSet

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

Page 24: Technische Universität München · Strings sind nicht veränderbare Objekte Zeichenkodierung Lösung: StringBuilder Char Array MarshalAs CharSet [DllImport("user32.dll", CharSet

Technische Universität München

Vielen Dank für Ihre

Aufmerksamkeit

06.02.2013 24Thomas Hörmann .Net InterOP