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

Post on 07-Jul-2020

2 views 0 download

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