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. 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 |
---|---|
Aktiviert oder deaktiviert optimale Zuordnung. |
|
Gibt die Aufrufkonvention an, die beim Übergeben von Methodenargumenten verwendet wird. Standard ist WinAPI, was __stdcall für Intel-basierte 32-Bit-Plattformen entspricht. |
|
Steuert die Namenszerlegung und gibt an, wie Zeichenfolgenargumente an die Funktion gemarshallt werden. Der Standardwert ist CharSet.Ansi. |
|
Gibt den DLL-Einstiegspunkt an, der aufgerufen wird. |
|
Steuert die Veränderung eines Einstiegspunktes, um dem Zeichensatz zu entsprechen. Der Standardwert variiert je nach Programmiersprache. |
|
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). |
|
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. |
|
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
Beispiele für Plattformaufrufe
Überlegungen zur Plattformaufrufsicherheit
Identifizieren von Funktionen in DLLs
Erstellen einer Klasse zum Halten von DLL-Funktionen