Funktionsimport in eine Klasse einbinden
public partial class MyClass
{
// Funktion _Initialize() aus mytest.dll importieren
// C/C++: int _Initialize(char *cpFileName);
[DllImport("mytest.dll", EntryPoint="_Initialize", ExactSpelling=false, CallingConvention=CallingConvention.Cdecl)]
private static extern int _Initialize(string sFileName);
// Funktion _Add() aus mytest.dll importieren
// C/C++: int _Add(int a, int b);
[DllImport("mytest.dll", EntryPoint="_Add", ExactSpelling=false, CallingConvention=CallingConvention.Cdecl)]
private static extern int _Add(int a, int b);
public int Initialize(string sFileName)
{
return _Initialize(sFileName);
}
public int Add(int a, int b)
{
return _Add(a, b);
}
}
// Aufruf der DLLFunktion über das Objekt
MyClass DLLObject = new MyClass();
int iResult = DLLObject.Initialize("test.ini");
int iSum = DLLObject.Add(1, 2);
besondere Typen (z.B. structe) übergeben
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
public partial class Win32ImportClass
{
// in C/C++
// RECT rc;
// HWND hwnd = FindWindow("main", NULL);
// ::GetWindowRect(hwnd, &rc);
[DllImport("user32.dll")]
public static extern int GetWindowRect(int hwnd, ref RECT rc);
// bei Klassenstrukturen anstelle von Structen -> Marshallen:
// public static extern int GetWindowRect(int hwnd, [MarshalAs(UnmanagedType.LPStruct)] RECT rc);
}
// Anwendung
RECT rc = new RECT();
int hwnd = // hier noch das Handle holen ...
Win32ImportClass.GetWindowRect(hwnd, ref rc);
Hinweis
Sobald das Hostprojekt mit Plattformtyp „AnyCPU“ compiliert wird, wird diese auf einem 64Bit-System (z.B. Windows 7 64Bit) auch als 64Bit-Anwendung ausgeführt. Wird nun auf diesem 64Bit-System eine 32Bit unmanaged DLL in die 64Bit-Hostanwendung geladen, führt dies zu einer System.BadImageFormatException. Es gibt zwei Möglichkeiten dies zu umgehen:
- Hostanwendung als Plattformtyp „x86“ (32Bit) kompilieren (Projekt->Eigenschaften->Erstellen->Zielplattform->x86), so dass auch unter einem 64Bit-System die Anwendung zwangsweise als 32Bit ausgeführt wird
- oder die DLL zu einer 64Bit DLL umwandeln und kompilieren