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.

HinweisHinweis

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. 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

Um die Felder BestFitMapping, CallingConvention, ExactSpelling, PreserveSig, SetLastError oder ThrowOnUnmappableChar auf eine Microsoft Visual Basic 2005-Deklaration anzuwenden, müssen Sie das DllImportAttribute-Attribut statt der Declare-Anweisung 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 festzulegen.

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 Link zu Informationen, wie diese Felder zum Definieren nicht verwalteter DLL-Funktionen verwendet werden.

Feld

Beschreibung

BestFitMapping

Aktiviert oder deaktiviert optimale Zuordnung.

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. Der Standardwert 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

Gibt dem Aufrufer die Möglichkeit, mithilfe der Marshal.GetLastWin32Error-API-Funktion 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

Überlegungen zur Plattformaufrufsicherheit

Identifizieren von Funktionen in DLLs

Erstellen einer Klasse zum Halten von DLL-Funktionen

Weitere Ressourcen

Aufrufen einer DLL-Funktion