Freigeben über


Declare-Anweisung

Deklariert einen Verweis auf eine in einer externen Datei implementierte Prozedur.

Syntax

[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ Overloads ] _
Declare [ charsetmodifier ] [ Sub ] name Lib "libname" _
[ Alias "aliasname" ] [ ([ parameterlist ]) ]
' -or-
[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ Overloads ] _
Declare [ charsetmodifier ] [ Function ] name Lib "libname" _
[ Alias "aliasname" ] [ ([ parameterlist ]) ] [ As returntype ]

Bestandteile

Begriff Definition
attributelist Wahlfrei. Siehe Attributliste.
accessmodifier Wahlfrei. Dabei kann es sich um eine der folgenden Methoden handeln:

- Öffentlich
- Geschützt
- Freund
- Privat
- Geschützter Freund
- Privat geschützt

Siehe Access-Ebenen in Visual Basic.
Shadows Wahlfrei. Siehe Schatten.
charsetmodifier Wahlfrei. Gibt Zeichensatz- und Dateisuchinformationen an. Dabei kann es sich um eine der folgenden Methoden handeln:

- Ansi (Standard)
- Unicode
- Automatisch
Sub Optional, aber entweder Sub oder Function muss angezeigt werden. Gibt an, dass die externe Prozedur keinen Wert zurückgibt.
Function Optional, aber entweder Sub oder Function muss angezeigt werden. Gibt an, dass die externe Prozedur einen Wert zurückgibt.
name Erforderlich. Name dieses externen Verweises. Weitere Informationen finden Sie unter "Deklarierte Elementnamen".
Lib Erforderlich. Führt eine Lib Klausel ein, die die externe Datei (DLL oder Coderessource) identifiziert, die eine externe Prozedur enthält.
libname Erforderlich. Der Name der Datei, die die deklarierte Prozedur enthält.
Alias Wahlfrei. Gibt an, dass die deklarierte Prozedur nicht innerhalb der Datei anhand des in nameder Datei angegebenen Namens identifiziert werden kann. Sie geben ihre Identifikation in aliasname.
aliasname Erforderlich, wenn Sie das Alias Schlüsselwort verwenden. Zeichenfolge, die die Prozedur auf eine von zwei Arten identifiziert:

Der Einstiegspunktname der Prozedur innerhalb der Datei in Anführungszeichen ("")

-oder-

Ein Nummernzeichen (#) gefolgt von einer ganzen Zahl, die die Ordnungszahl des Einstiegspunkts der Prozedur in der Datei angibt
parameterlist Erforderlich, wenn die Prozedur Parameter akzeptiert. Siehe Parameterliste.
returntype Erforderlich, wenn Function angegeben und Option Strict ist On. Datentyp des von der Prozedur zurückgegebenen Werts.

Bemerkungen

Manchmal müssen Sie eine Prozedur aufrufen, die in einer Datei (z. B. einer DLL oder Coderessource) außerhalb Ihres Projekts definiert ist. Wenn Sie dies tun, hat der Visual Basic-Compiler keinen Zugriff auf die Informationen, die er benötigt, um die Prozedur ordnungsgemäß aufzurufen, z. B. wo sich die Prozedur befindet, wie sie identifiziert wird, ihre Aufrufsequenz und den Rückgabetyp sowie den von ihm verwendeten Zeichenfolgenzeichensatz. Die Declare Anweisung erstellt einen Verweis auf eine externe Prozedur und stellt diese erforderlichen Informationen bereit.

Sie können nur auf Modulebene verwenden Declare . Dies bedeutet, dass der Deklarationskontext für einen externen Verweis eine Klasse, Struktur oder ein Modul sein muss und keine Quelldatei, namespace, Schnittstelle, Prozedur oder Block sein kann. Weitere Informationen finden Sie unter Deklarationskontexte und Standardzugriffsebenen.

Externe Verweise werden standardmäßig auf den öffentlichen Zugriff festgelegt. Sie können ihre Zugriffsebenen mit den Zugriffsmodifizierern anpassen.

Regeln

  • Attribute Sie können Attribute auf einen externen Verweis anwenden. Jedes angewendete Attribut hat nur Auswirkungen auf Ihr Projekt, nicht in der externen Datei.

  • Modifizierer. Externe Prozeduren werden implizit freigegeben. Sie können das Shared Schlüsselwort nicht verwenden, wenn Sie einen externen Verweis deklarieren, und Sie können den freigegebenen Status nicht ändern.

    Eine externe Prozedur kann nicht an überschreiben, Schnittstellenmmber implementieren oder Ereignisse behandeln. Dementsprechend können Sie das OverridesSchlüsselwort , Overridable, NotOverridableMustOverrideImplementsoder Handles das Schlüsselwort nicht in einer Declare Anweisung verwenden.

  • Name der externen Prozedur. Sie müssen diesem externen Verweis nicht denselben Namen (in name) wie den Einstiegspunktnamen der Prozedur in der externen Datei (aliasname) zuweisen. Sie können eine Alias Klausel verwenden, um den Einstiegspunktnamen anzugeben. Dies kann hilfreich sein, wenn die externe Prozedur denselben Namen wie ein reservierter Visual Basic-Modifizierer oder eine Variable, Prozedur oder ein anderes Programmierelement im selben Bereich aufweist.

    Hinweis

    Einstiegspunktnamen in den meisten DLLs beachten die Groß-/Kleinschreibung.

  • Externe Prozedurnummer. Alternativ können Sie eine Alias Klausel verwenden, um die Ordnungszahl des Einstiegspunkts in der Exporttabelle der externen Datei anzugeben. Dazu beginnen aliasname Sie mit einem Nummernzeichen (#). Dies kann hilfreich sein, wenn ein Beliebiges Zeichen im Namen der externen Prozedur in Visual Basic nicht zulässig ist oder wenn die externe Datei die Prozedur ohne Namen exportiert.

Datentypregeln

  • Parameterdatentypen. Wenn Option Strict ja On, müssen Sie den Datentyp der einzelnen Parameter angeben in parameterlist. Dies kann ein beliebiger Datentyp oder der Name einer Enumeration, Struktur, Klasse oder Schnittstelle sein. In parameterlistdiesem Bereich verwenden Sie eine As Klausel, um den Datentyp des Arguments anzugeben, das an jeden Parameter übergeben werden soll.

    Hinweis

    Wenn die externe Prozedur nicht für .NET Framework geschrieben wurde, müssen Sie darauf achten, dass die Datentypen entsprechen. Wenn Sie z. B. einen externen Verweis auf eine Visual Basic 6.0-Prozedur mit einem Integer Parameter (16 Bit in Visual Basic 6.0) deklarieren, müssen Sie das entsprechende Argument wie Short in der Declare Anweisung identifizieren, da dies der ganzzahlige 16-Bit-Typ in Visual Basic ist. Long Entsprechend weist visual Basic 6.0 eine andere Datenbreite auf und Date wird anders implementiert.

  • Datentyp zurückgeben. Wenn es sich bei der externen Prozedur um eine Function und Option Strict dies handelt On, müssen Sie den Datentyp des werts angeben, der an den aufrufenden Code zurückgegeben wird. Dies kann ein beliebiger Datentyp oder der Name einer Enumeration, Struktur, Klasse oder Schnittstelle sein.

    Hinweis

    Der Visual Basic-Compiler überprüft nicht, ob Die Datentypen mit denen der externen Prozedur kompatibel sind. Wenn ein Konflikt vorliegt, generiert die Common Language Runtime zur Laufzeit eine MarshalDirectiveException Ausnahme.

  • Standarddatentypen. Wenn Option Strict der Datentyp eines Parameters nicht parameterlistangegeben wirdOff, konvertiert der Visual Basic-Compiler das entsprechende Argument in den Objektdatentyp. Wenn Sie nicht angeben returntype, verwendet der Compiler den Rückgabedatentyp entsprechend Object.

    Hinweis

    Da Sie sich mit einem externen Verfahren befassen, das möglicherweise auf einer anderen Plattform geschrieben wurde, ist es gefährlich, annahmen über Datentypen zu machen oder sie standardmäßig zuzulassen. Es ist viel sicherer, den Datentyp jedes Parameters und des Rückgabewerts anzugeben, falls vorhanden. Dadurch wird auch die Lesbarkeit des Codes verbessert.

Verhalten

  • Bereich. Ein externer Verweis befindet sich innerhalb seiner Klasse, Struktur oder des Moduls im Gültigkeitsbereich.

  • Lebensdauer. Ein externer Verweis hat dieselbe Lebensdauer wie die Klasse, Struktur oder das Modul, in der er deklariert wird.

  • Aufrufen einer externen Prozedur. Sie rufen eine externe Prozedur auf die gleiche Weise auf, wie Sie eine FunctionSub Prozedur aufrufen – indem Sie sie in einem Ausdruck verwenden, wenn ein Wert zurückgegeben wird, oder indem Sie sie in einer Call-Anweisung angeben, wenn kein Wert zurückgegeben wird.

    Sie übergeben Argumente genau wie in der Anweisung angegeben parameterlist an die Declare externe Prozedur. Berücksichtigen Sie nicht, wie die Parameter ursprünglich in der externen Datei deklariert wurden. Wenn ein Rückgabewert vorhanden returntype ist, verwenden Sie ihn entsprechend der Angabe in der Declare Anweisung.

  • Zeichensätze. Sie können angeben charsetmodifier , wie Visual Basic Zeichenfolgen marshallen soll, wenn sie die externe Prozedur aufruft. Der Ansi Modifizierer leitet Visual Basic an, alle Zeichenfolgen an ANSI-Werte zu marshallen, und der Unicode Modifizierer leitet ihn an, alle Zeichenfolgen an Unicode-Werte zu marshallen. Der Auto Modifizierer leitet Visual Basic gemäß .NET Framework-Regeln basierend auf dem externen Verweis nameoder aliasname falls angegeben, visual Basic auf Marshallalzeichenfolgen weiter. Der Standardwert ist Ansi.

    charsetmodifier Gibt außerdem an, wie Visual Basic die externe Prozedur innerhalb der externen Datei nachschlagen soll. Ansi und Unicode beide direct Visual Basic, um es nachzuschlagen, ohne den Namen während der Suche zu ändern. Auto leitet Visual Basic an, um den Basiszeichensatz der Laufzeitplattform zu bestimmen und möglicherweise den Namen der externen Prozedur wie folgt zu ändern:

    • Suchen Sie auf einer Unicode-Plattform wie Windows zuerst die externe Prozedur ohne Namensänderung nach. Wenn dies fehlschlägt, fügen Sie "W" am Ende des Namens der externen Prozedur an, und suchen Sie es erneut.

    • Suchen Sie auf einer ANSI-Plattform zuerst nach dem externen Verfahren ohne Namensänderung. Wenn dies fehlschlägt, fügen Sie "A" am Ende des Namens der externen Prozedur an, und suchen Sie es erneut.

  • Mechanismus. Visual Basic verwendet den .NET Framework-Plattform-Aufrufmechanismus (PInvoke), um externe Prozeduren aufzulösen und darauf zuzugreifen. Die Declare Anweisung und die DllImportAttribute Klasse verwenden diesen Mechanismus automatisch, und Sie benötigen keine Kenntnisse von PInvoke. Weitere Informationen finden Sie unter Exemplarische Vorgehensweise: Aufrufen von Windows-APIs.

Von Bedeutung

Wenn die externe Prozedur außerhalb der Common Language Runtime (CLR) ausgeführt wird, handelt es sich um nicht verwalteten Code. Wenn Sie eine solche Prozedur aufrufen, z. B. eine Windows-API-Funktion oder eine COM-Methode, können Sie Ihre Anwendung Sicherheitsrisiken offenlegen. Weitere Informationen finden Sie unter Secure Coding Guidelines for Unmanaged Code.

Beispiel 1

Im folgenden Beispiel wird ein externer Verweis auf eine Function Prozedur deklariert, die den aktuellen Benutzernamen zurückgibt. Anschließend wird die externe Prozedur als Teil der getUser Prozedur GetUserNameA aufgerufen.

Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (
    ByVal lpBuffer As String, ByRef nSize As Integer) As Integer
Sub GetUser()
    Dim buffer As String = New String(CChar(" "), 25)
    Dim retVal As Integer = GetUserName(buffer, 25)
    Dim userName As String = Strings.Left(buffer, InStr(buffer, Chr(0)) - 1)
    MsgBox(userName)
End Sub

Beispiel 2

Dies DllImportAttribute bietet eine alternative Möglichkeit zum Verwenden von Funktionen in nicht verwalteten Code. Im folgenden Beispiel wird eine importierte Funktion deklariert, ohne eine Declare Anweisung zu verwenden.

' Add an Imports statement at the top of the class, structure, or
' module that uses the DllImport attribute.
Imports System.Runtime.InteropServices
<DllImportAttribute("kernel32.dll", EntryPoint:="MoveFileW",
    SetLastError:=True, CharSet:=CharSet.Unicode,
    ExactSpelling:=True,
    CallingConvention:=CallingConvention.StdCall)>
Public Shared Function MoveFile(ByVal src As String,
  ByVal dst As String) As Boolean
    ' This function copies a file from the path src to the path dst.
    ' Leave this function empty. The DLLImport attribute forces calls
    ' to MoveFile to be forwarded to MoveFileW in KERNEL32.DLL.
End Function

Siehe auch