Megosztás a következőn keresztül:


Nyilatkozat deklarálása

Külső fájlban végrehajtott eljárásra mutató hivatkozást deklarál.

Szemantika

[ <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 ]

Részek

Időszak Definíció
attributelist Opcionális. Lásd : Attribútumlista.
accessmodifier Opcionális. A következők egyike lehet:

- Nyilvános
- Védett
- Barát
- Privát
- Védett barát
- Privát védelem

Lásd a Visual Basic hozzáférési szintjeinek megtekintését.
Shadows Opcionális. Lásd : Árnyékok.
charsetmodifier Opcionális. Megadja a karakterkészletet és a fájlkeresési információkat. A következők egyike lehet:

- Ansi (alapértelmezett)
- Unicode
- Kocsi
Sub Nem kötelező, de vagy meg SubFunction kell jelennie. Azt jelzi, hogy a külső eljárás nem ad vissza értéket.
Function Nem kötelező, de vagy meg SubFunction kell jelennie. Azt jelzi, hogy a külső eljárás egy értéket ad vissza.
name Szükséges. A külső hivatkozás neve. További információ: Deklarált elemnevek.
Lib Szükséges. Bevezet egy záradékot Lib , amely azonosítja a külső eljárást tartalmazó külső fájlt (DLL vagy kóderőforrás).
libname Szükséges. A deklarált eljárást tartalmazó fájl neve.
Alias Opcionális. Azt jelzi, hogy a deklarált eljárás nem azonosítható a fájlban namea megadott név alapján. Az azonosítót a következőben aliasnameadhatja meg: .
aliasname A kulcsszó használata Alias esetén kötelező megadni. Az eljárást kétféleképpen azonosító sztring:

Az eljárás belépési pontjának neve a fájlban, idézőjeleken belül ("")

-vagy-

Számjel (#) és egy egész szám, amely megadja az eljárás belépési pontjának sorszámát a fájlban
parameterlist Akkor szükséges, ha az eljárás paramétereket vesz fel. Lásd : Paraméterlista.
returntype Kötelező, ha Function meg van adva, és Option Strict az .On Az eljárás által visszaadott érték adattípusa.

Megjegyzések

Előfordulhat, hogy a projekten kívüli fájlban (például DLL-ben vagy kóderőforrásban) meghatározott eljárást kell meghívnia. Ha ezt teszi, a Visual Basic fordító nem fér hozzá az eljárás helyes meghívásához szükséges információkhoz, például az eljárás helyét, az azonosítás módját, a hívássorozatot és a visszatérési típust, valamint az általa használt sztring karaktert. Az Declare utasítás egy külső eljárásra mutató hivatkozást hoz létre, és megadja ezeket a szükséges információkat.

Csak modulszinten használható Declare . Ez azt jelenti, hogy a külső hivatkozás deklarációs környezetének osztálynak, struktúrának vagy modulnak kell lennie, és nem lehet forrásfájl, névtér, interfész, eljárás vagy blokk. További információ: Deklarációs környezetek és alapértelmezett hozzáférési szintek.

A külső hivatkozások alapértelmezés szerint nyilvános hozzáférésre mutatnak. A hozzáférési szinteket a hozzáférési módosítókkal módosíthatja.

Szabályok

  • Attribútumok. Attribútumokat alkalmazhat külső hivatkozásra. Az alkalmazott attribútumok csak a projektben érvényesek, a külső fájlban nem.

  • Módosítók. A külső eljárások implicit módon meg vannak osztva. Külső hivatkozás deklarálásakor nem használhatja a Shared kulcsszót, és nem módosíthatja annak megosztott állapotát.

    A külső eljárások nem vehetnek részt a felülírásban, nem implementálhatók az interfésztagok, és nem kezelhetik az eseményeket. Ennek megfelelően nem használhatja a Overrides, Overridable, , NotOverridable, MustOverrideImplementsHandles vagy kulcsszót egy Declare utasításban.

  • Külső eljárás neve. Ennek a külső hivatkozásnak nem kell ugyanazt a nevet (in name) megadnia, mint az eljárás belépési pontjának neve a külső fájlban (aliasname). A belépési pont nevét záradékkal Alias adhatja meg. Ez akkor lehet hasznos, ha a külső eljárás neve megegyezik a Visual Basic fenntartott módosító nevével, vagy egy változó, eljárás vagy bármely más programozási elem ugyanabban a hatókörben.

    Megjegyzés:

    A legtöbb DLL-ben a belépési pontok neve megkülönbözteti a kis- és nagybetűket.

  • Külső eljárásszám. Másik lehetőségként egy Alias záradék használatával megadhatja a belépési pont sorszámát a külső fájl exportálási táblázatában. Ehhez egy számjellel (#) kell kezdeniealiasname. Ez akkor lehet hasznos, ha a külső eljárásnév egyik karaktere sem engedélyezett a Visual Basicben, vagy ha a külső fájl név nélkül exportálja az eljárást.

Adattípus-szabályok

  • Paraméter adattípusai. Ha Option Strict igen On, meg kell adnia az egyes paraméterek adattípusát a következőben parameterlist: . Ez lehet bármilyen adattípus, vagy egy enumerálás, struktúra, osztály vagy felület neve. Ezen belül parameterlistegy As záradék használatával adja meg az egyes paramétereknek átadni kívánt argumentum adattípusát.

    Megjegyzés:

    Ha a külső eljárás nem a .NET-keretrendszerhez lett megírva, gondoskodnia kell arról, hogy az adattípusok megfeleljenek. Ha például külső hivatkozást deklarál egy Visual Basic 6.0-eljárásra egy Integer paraméterrel (16 bit a Visual Basic 6.0-ban), akkor a megfelelő argumentumot Short az utasításban Declare kell azonosítania, mivel ez a Visual Basic 16 bites egész típusa. Hasonlóképpen, Long a Visual Basic 6.0-ban eltérő adatszélességgel rendelkezik, és Date másképpen van implementálva.

  • Adattípust ad vissza. Ha a külső eljárás egy Function és Option Strict az On, meg kell adnia a hívó kódnak visszaadott érték adattípusát. Ez lehet bármilyen adattípus, vagy egy enumerálás, struktúra, osztály vagy felület neve.

    Megjegyzés:

    A Visual Basic fordító nem ellenőrzi, hogy az adattípusok kompatibilisek-e a külső eljáráséval. Ha eltérés van, a közös nyelvi futtatókörnyezet kivételt MarshalDirectiveException hoz létre futásidőben.

  • Alapértelmezett adattípusok. Ha Option Strict igen, Off és nem adja meg egy paraméter parameterlistadattípusát, a Visual Basic fordító a megfelelő argumentumot objektum adattípussá alakítja. Hasonlóképpen, ha nem adja meg returntype, a fordító a visszatérési adattípust Objectveszi alapul.

    Megjegyzés:

    Mivel olyan külső eljárásokkal foglalkozik, amelyeket esetleg egy másik platformon írtak, veszélyes az adattípusokra vonatkozó feltételezések készítése vagy az alapértelmezett beállítások engedélyezése. Sokkal biztonságosabb minden paraméter és a visszatérési érték adattípusát megadni, ha van ilyen. Ez a kód olvashatóságát is javítja.

Magatartás

  • Hatókör A külső hivatkozás az osztály, a struktúra vagy a modul hatókörében van.

  • Élettartam. A külső hivatkozás élettartama megegyezik azzal az osztálysal, struktúrával vagy modullal, amelyben deklarálva van.

  • Külső eljárás meghívása. A külső eljárásokat ugyanúgy hívhatja meg, mint egy Function eljárást Sub – ha egy kifejezést használ, ha értéket ad vissza, vagy ha nem ad vissza értéket, a hívási utasításban adja meg.

    Az argumentumokat pontosan az utasításban parameterlist megadott módon adja át a Declare külső eljárásnak. Ne vegye figyelembe, hogy a paraméterek eredetileg hogyan lettek deklarálva a külső fájlban. Hasonlóképpen, ha van visszatérési érték, használja pontosan az utasításban returntypeDeclare megadott módon.

  • Karakterkészleteket. Megadhatja, charsetmodifier hogy a Visual Basic hogyan alkalmazza a sztringeket, amikor meghívja a külső eljárást. A Ansi módosító az összes sztring ANSI-értékekre való marshalálására irányítja a Visual Basicet, a Unicode módosító pedig az összes sztringEt Unicode-értékekre irányítja. A Auto módosító a Visual Basicet irányítja a .NET-keretrendszer szabályainak megfelelő, a külső hivatkozás namealapján vagy aliasname ha meg van adva. Az alapértelmezett érték a Ansi.

    charsetmodifier azt is meghatározza, hogy a Visual Basic hogyan keresse meg a külső eljárást a külső fájlban. Ansi és Unicode mindkettő a Visual Basicet arra utasítja, hogy a keresés során ne módosítsa a nevét. Auto A Visual Basic irányítja a futtató platform alapkaraktere meghatározására, és esetleg módosítja a külső eljárás nevét az alábbiak szerint:

    • Egy Unicode-platformon, például a Windowson először névmódosítás nélkül keresse meg a külső eljárást. Ha ez nem sikerül, fűzze hozzá a "W" elemet a külső eljárásnév végéhez, és keresse meg újra.

    • Egy ANSI-platformon először névmódosítás nélkül keresse meg a külső eljárást. Ha ez nem sikerül, fűzze hozzá az "A" elemet a külső eljárásnév végéhez, és keresse meg újra.

  • Mechanizmus. A Visual Basic a .NET-keretrendszer platformhívási (PInvoke) mechanizmusával oldja meg és éri el a külső eljárásokat. Az Declare utasítás és az osztály is automatikusan használja ezt a DllImportAttribute mechanizmust, és nincs szükség a PInvoke ismeretére. További információ : Útmutató: Windows API-k meghívása.

Fontos

Ha a külső eljárás a közös nyelvi futtatókörnyezeten (CLR) kívül fut, az nem felügyelt kód. Ha ilyen eljárást hív meg, például Windows API-függvényt vagy COM-metódust, biztonsági kockázatoknak teheti ki az alkalmazást. További információ: Biztonságos kódolási irányelvek a nem felügyelt kódhoz.

1. példa

Az alábbi példa egy olyan eljárás külső hivatkozását Function deklarálja, amely az aktuális felhasználónevet adja vissza. Ezután meghívja a külső eljárást GetUserNameA az getUser eljárás részeként.

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

2. példa

Ez DllImportAttribute alternatív módot kínál a függvények nem felügyelt kódban való használatára. Az alábbi példa egy importált függvényt deklarál utasítás nélkül Declare .

' 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

Lásd még