Deklarera -instruktion
Deklarerar en referens till en procedur som implementerats i en extern fil.
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 ]
Delar
Period | Definition |
---|---|
attributelist |
Valfritt. Se Attributlista. |
accessmodifier |
Valfritt. Kan vara något av följande: - Offentliga - Skyddade - Vän - Privat - Skyddad vän - Privat skyddad Se Åtkomstnivåer i Visual Basic. |
Shadows |
Valfritt. Se Skuggor. |
charsetmodifier |
Valfritt. Anger teckenuppsättning och filsökningsinformation. Kan vara något av följande: - Ansi (standard) - Unicode - Auto |
Sub |
Valfritt, men antingen Sub eller Function måste visas. Anger att den externa proceduren inte returnerar något värde. |
Function |
Valfritt, men antingen Sub eller Function måste visas. Anger att den externa proceduren returnerar ett värde. |
name |
Obligatoriska. Namnet på den här externa referensen. Mer information finns i Namn på deklarerade element. |
Lib |
Obligatoriska. Introducerar en Lib sats som identifierar den externa filen (DLL eller kodresurs) som innehåller en extern procedur. |
libname |
Obligatoriska. Namnet på filen som innehåller den deklarerade proceduren. |
Alias |
Valfritt. Anger att proceduren som deklareras inte kan identifieras i filen med det namn som anges i name . Du anger dess identifiering i aliasname . |
aliasname |
Krävs om du använder nyckelordet Alias . Sträng som identifierar proceduren på något av två sätt:Startpunktens namn på proceduren i filen, inom citattecken ( "" )-eller- Ett taltecken ( # ) följt av ett heltal som anger ordningstalet för procedurens startpunkt i filen |
parameterlist |
Krävs om proceduren tar parametrar. Se Parameterlista. |
returntype |
Krävs om Function anges och Option Strict är On . Datatyp för det värde som returneras av proceduren. |
Kommentarer
Ibland måste du anropa en procedur som definierats i en fil (till exempel en DLL eller kodresurs) utanför projektet. När du gör detta har Visual Basic-kompilatorn inte åtkomst till den information som krävs för att anropa proceduren korrekt, till exempel var proceduren finns, hur den identifieras, dess anropssekvens och returtyp samt strängteckenuppsättningen som används. Instruktionen Declare
skapar en referens till en extern procedur och tillhandahåller den nödvändiga informationen.
Du kan bara använda Declare
på modulnivå. Det innebär att deklarationskontexten för en extern referens måste vara en klass, struktur eller modul och får inte vara en källfil, namnrymd, gränssnitt, procedur eller blockering. Mer information finns i Deklarationskontexter och standardåtkomstnivåer.
Externa referenser är standard för offentlig åtkomst. Du kan justera deras åtkomstnivåer med åtkomstmodifierarna.
Regler
Attribut. Du kan använda attribut för en extern referens. Alla attribut som du tillämpar gäller endast i projektet, inte i den externa filen.
Modifierare. Externa procedurer delas implicit. Du kan inte använda nyckelordet
Shared
när du deklarerar en extern referens och du kan inte ändra dess delade status.En extern procedur kan inte delta i att åsidosätta, implementera gränssnittsmedlemmar eller hantera händelser. Därför kan du inte använda nyckelordet
Overrides
,Overridable
,NotOverridable
,MustOverride
,Implements
ellerHandles
i enDeclare
-instruktion.Namn på extern procedur. Du behöver inte ge den här externa referensen samma namn (i
name
) som procedurens startpunktsnamn i den externa filen (aliasname
). Du kan använda enAlias
sats för att ange startpunktsnamnet. Detta kan vara användbart om den externa proceduren har samma namn som en reserverad modifierare för Visual Basic eller en variabel, procedur eller något annat programmeringselement i samma omfång.Kommentar
Startpunktsnamn i de flesta DLL:er är skiftlägeskänsliga.
Externt procedurnummer. Du kan också använda en
Alias
sats för att ange ordningstalet för startpunkten i exporttabellen för den externa filen. För att göra detta börjaraliasname
du med ett taltecken (#
). Detta kan vara användbart om något tecken i det externa procedurnamnet inte tillåts i Visual Basic, eller om den externa filen exporterar proceduren utan namn.
Regler för datatyp
Parameterdatatyper. Om
Option Strict
ärOn
måste du ange datatypen för varje parameter iparameterlist
. Det kan vara valfri datatyp eller namnet på en uppräkning, struktur, klass eller gränssnitt. Iparameterlist
använder du enAs
-sats för att ange datatypen för argumentet som ska skickas till varje parameter.Kommentar
Om den externa proceduren inte har skrivits för .NET Framework måste du se till att datatyperna motsvarar dem. Om du till exempel deklarerar en extern referens till en Visual Basic 6.0-procedur med en
Integer
parameter (16 bitar i Visual Basic 6.0) måste du identifiera motsvarande argument somShort
i -instruktionenDeclare
, eftersom det är 16-bitars heltalstypen i Visual Basic.Long
På samma sätt har en annan databredd i Visual Basic 6.0 ochDate
implementeras på olika sätt.Returnera datatyp. Om den externa proceduren är en
Function
ochOption Strict
ärOn
måste du ange datatypen för det värde som returneras till den anropande koden. Det kan vara valfri datatyp eller namnet på en uppräkning, struktur, klass eller gränssnitt.Kommentar
Visual Basic-kompilatorn verifierar inte att dina datatyper är kompatibla med dem i den externa proceduren. Om det finns ett matchningsfel genererar den vanliga språkkörningen ett MarshalDirectiveException undantag vid körning.
Standarddatatyper. Om
Option Strict
ärOff
och du inte anger datatypen för en parameter iparameterlist
konverterar Visual Basic-kompilatorn motsvarande argument till objektdatatypen. På samma sätt, om du inte angerreturntype
, tar kompilatorn returdatatypen tillObject
.Kommentar
Eftersom du har att göra med en extern procedur som kan ha skrivits på en annan plattform är det farligt att göra några antaganden om datatyper eller att tillåta dem som standard. Det är mycket säkrare att ange datatypen för varje parameter och returvärdet, om det finns. Detta förbättrar också kodens läsbarhet.
Funktionssätt
Omfattning. En extern referens finns i omfånget i dess klass, struktur eller modul.
Livslängd. En extern referens har samma livslängd som den klass, struktur eller modul där den deklareras.
Anropar en extern procedur. Du anropar en extern procedur på samma sätt som du anropar en
Function
ellerSub
-procedur– genom att använda den i ett uttryck om det returnerar ett värde eller genom att ange det i en anropsinstruktur om det inte returnerar ett värde.Du skickar argument till den externa proceduren exakt enligt vad som anges i
parameterlist
-instruktionenDeclare
. Ta inte hänsyn till hur parametrarna ursprungligen deklarerades i den externa filen. På samma sätt, om det finns ett returvärde, använder du det exakt som anges avreturntype
i -instruktionenDeclare
.Teckenuppsättningar. Du kan ange i
charsetmodifier
hur Visual Basic ska konvertera strängar när den anropar den externa proceduren. ModifierarenAnsi
dirigerar Visual Basic till att konvertera alla strängar till ANSI-värden, ochUnicode
modifieraren dirigerar den till att konvertera alla strängar till Unicode-värden. ModifierarenAuto
dirigerar Visual Basic till marskalksträngar enligt .NET Framework-regler baserat på den externa referensenname
, elleraliasname
om det anges. Standardvärdet ärAnsi
.charsetmodifier
anger också hur Visual Basic ska leta upp den externa proceduren i den externa filen.Ansi
ochUnicode
båda dirigerar Visual Basic för att slå upp det utan att ändra dess namn under sökningen.Auto
dirigerar Visual Basic till att fastställa basteckenuppsättningen för körningsplattformen och eventuellt ändra namnet på den externa proceduren enligt följande:På en Unicode-plattform, till exempel Windows, letar du först upp den externa proceduren utan namnändring. Om det misslyckas lägger du till "W" i slutet av det externa procedurnamnet och söker upp det igen.
På en ANSI-plattform letar du först upp den externa proceduren utan namnändring. Om det misslyckas lägger du till "A" i slutet av det externa procedurnamnet och letar upp det igen.
Mekanism. Visual Basic använder mekanismen .NET Framework platform invoke (PInvoke) för att lösa och komma åt externa procedurer. Instruktionen
Declare
och klassen använder båda den DllImportAttribute här mekanismen automatiskt, och du behöver ingen kunskap om PInvoke. Mer information finns i Genomgång: Anropa Windows-API:er.
Viktigt!
Om den externa proceduren körs utanför CLR (Common Language Runtime) är den ohanterad kod. När du anropar en sådan procedur, till exempel en Windows API-funktion eller en COM-metod, kan du utsätta programmet för säkerhetsrisker. Mer information finns i Riktlinjer för säker kodning för ohanterad kod.
Exempel 1
I följande exempel deklareras en extern referens till en Function
procedur som returnerar det aktuella användarnamnet. Den anropar sedan den externa proceduren GetUserNameA
som en del av proceduren getUser
.
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
Exempel 2
Ger DllImportAttribute ett alternativt sätt att använda funktioner i ohanterad kod. I följande exempel deklareras en importerad funktion utan att använda en Declare
-instruktion.
' 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