Erstellen von Prototypen in verwaltetem Code

In diesem Abschnitt wird der Zugriff auf nicht verwaltete Funktionen beschrieben. Außerdem erfolgt eine Einführung in mehrere Attributfelder, die Methodendefinitionen in verwaltetem Code kommentieren. Beispiele für das Erstellen von .NET-basierten Deklarationen, die mit Plattformaufruf verwendet werden, finden Sie unter Marshallen von Daten mit Plattformaufruf.

Um auf eine nicht verwaltete DLL-Funktion von verwaltetem Code aus zugreifen zu können, benötigen Sie den Namen der Funktion und der DLL, die sie exportiert. Mithilfe dieser Informationen können Sie die verwaltete Definition für eine nicht verwaltete Funktion schreiben, die in einer DLL implementiert ist. Außerdem können Sie anpassen, wie durch Plattformaufrufe die Funktion erstellt wird und Daten zu und von der Funktion gemarshallt werden.

Hinweis

Mithilfe von Win32-API-Funktionen, die eine Zeichenfolge reservieren, können Sie die Zeichenfolge freigeben, indem Sie z. B. die LocalFree-Methode verwenden. Durch Plattformaufrufe werden solche Parameter unterschiedlich behandelt. Für Plattformaufrufe verwenden Sie den Parametertyp IntPtr anstelle des String-Typs. Verwenden Sie Methoden aus der System.Runtime.InteropServices.Marshal-Klasse, um den Typ manuell in eine Zeichenfolge zu konvertieren und freizugeben.

Grundlagen der Deklaration

Verwaltete Definitionen für nicht verwaltete Funktionen hängen von der Sprache ab, wie Sie in folgenden Beispielen sehen können. Um alle Sprachen anzuzeigen, klicken Sie auf die Schaltfläche Sprachfilter in der Ecke links oben auf der Seite. Ausführliche Codebeispiele finden Sie unter Beispiele für Plattformaufrufe.

Imports System.Runtime.InteropServices
Public Class Win32
    Declare Auto Function MessageBox Lib "user32.dll" _
       (ByVal hWnd As Integer, _
        ByVal txt As String, ByVal caption As String, _
        ByVal Typ As Integer) As IntPtr
End Class

Wenn Sie für eine Microsoft Visual Basic 2005-Deklaration das BestFitMapping-Feld, das CallingConvention-Feld, das ExactSpelling-Feld, das PreserveSig-Feld, das SetLastError-Feld oder das ThrowOnUnmappableChar-Feld anwenden möchten, müssen Sie anstelle der Declare-Anweisung das DllImportAttribute-Attribut verwenden.

Imports System.Runtime.InteropServices
Public Class Win32
   <DllImport ("user32.dll", CharSet := CharSet.Auto)> _
   Public Shared Function MessageBox (ByVal hWnd As Integer, _
        ByVal txt As String, ByVal caption As String, _
        ByVal Typ As Integer) As IntPtr
   End Function
End Class
using System.Runtime.InteropServices;
[DllImport("user32.dll")]
    public static extern IntPtr MessageBox(int hWnd, String text, 
                                       String caption, uint type);
using namespace System::Runtime::InteropServices;
[DllImport("user32.dll")]
    extern "C" IntPtr MessageBox(int hWnd, String* pText, String* pCaption,
                              unsigned int uType);

Anpassen der Definition

Attributfelder definieren das Verhalten von verwaltetem Code, ohne dass sie explizit festgelegt werden müssen. Plattformaufrufe funktionieren entsprechend der festgelegten Standardwerte für verschiedene Felder, die als Metadaten in einer Assembly vorhanden sind. Sie können dieses Standardverhalten ändern, indem Sie die Werte für ein oder mehrere Felder entsprechend anpassen. In vielen Fällen verwenden Sie das DllImportAttribute, um einen Wert einzustellen.

In der folgenden Tabelle wird der vollständige Satz aller Attributfelder angegeben, die sich auf Plattformaufrufe beziehen. Für jedes Feld wird der Standardwert angezeigt und ein Hyperlink zu Informationen, wie diese Felder zum Definieren nicht verwalteter DLL-Funktionen verwendet werden.

Feld Beschreibung

BestFitMapping

Schaltet die optimierte Zuordnung aus.

CallingConvention

Gibt die Aufrufkonvention an, die beim Übergeben von Methodenargumenten verwendet wird. Standard ist WinAPI, was __stdcall für Intel-basierte 32-Bit-Plattformen entspricht.

CharSet

Steuert die Namenszerlegung und gibt an, wie Zeichenfolgenargumente an die Funktion gemarshallt werden. Standardmäßig voreingestellt ist CharSet.Ansi.

EntryPoint

Gibt den DLL-Einstiegspunkt an, der aufgerufen wird.

ExactSpelling

Steuert die Veränderung eines Einstiegspunktes, um dem Zeichensatz zu entsprechen. Der Standardwert variiert je nach Programmiersprache.

PreserveSig

Steuert die Umwandlung der verwalteten Methodensignatur in eine nicht verwaltete Signatur, die ein HRESULT zurückgibt und ein zusätzliches Argument [out, retval] für den Rückgabewert besitzt.

Der Standardwert ist true (die Signatur wird nicht transformiert).

SetLastError

Ermöglicht dem Aufrufer, mithilfe der Marshal.GetLastWin32Error-Funktion der API festzustellen, ob beim Ausführen der Methode ein Fehler aufgetreten ist. In Visual Basic ist der Standardwert true, in C# und C++ false.

ThrowOnUnmappableChar

Steuert das Auslösen einer Ausnahme, wenn ein Unicode-Zeichen, das nicht zugeordnet werden kann, in das ANSI-Zeichen '?' konvertiert wird.

Detaillierte Verweisinformationen finden Sie unter DllImportAttribute-Klasse.

Siehe auch

Konzepte

Verwenden nicht verwalteter DLL-Funktionen
Angeben eines Einstiegspunktes
Angeben eines Zeichensatzes
Beispiele für Plattformaufrufe
Identifizieren von Funktionen in DLLs
Erstellen einer Klasse zum Halten von DLL-Funktionen

Weitere Ressourcen

Aufrufen einer DLL-Funktion