Declare Statement
Dichiara un riferimento a una routine implementata in un file esterno.
Sintassi
[ <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 ]
Parti
Termine | Definizione |
---|---|
attributelist |
Facoltativo. Vedere Elenco degli attributi. |
accessmodifier |
Facoltativo. Può essere uno dei seguenti: - Pubblica - Protected - Friend - Privata - Protected Friend - Private Protected Vedere Access levels in Visual Basic. |
Shadows |
Facoltativo. Vedere Shadows. |
charsetmodifier |
Facoltativo. Specifica le informazioni sul set di caratteri e sulla ricerca di file. Può essere uno dei seguenti: - Ansi (impostazione predefinita) - Unicode - Auto |
Sub |
Facoltativo, ma deve essere visualizzato Sub o Function . Indica che la routine esterna non restituisce un valore. |
Function |
Facoltativo, ma deve essere visualizzato Sub o Function . Indica che la routine esterna restituisce un valore. |
name |
Obbligatorio. Nome di questo riferimento esterno. Per altre informazioni, vedere Nomi di elementi dichiarati. |
Lib |
Obbligatorio. Introduce una clausola Lib che identifica il file esterno (DLL o risorsa codice) contenente una routine esterna. |
libname |
Obbligatorio. Nome del file che contiene la routine dichiarata. |
Alias |
Facoltativo. Indica che la routine dichiarata non può essere identificata all'interno del relativo file dal nome specificato in name . L'utente specifica l'identificazione in aliasname . |
aliasname |
Obbligatorio se si usa la parola chiave Alias . Stringa che identifica la routine in uno dei due modi seguenti:Nome del punto di ingresso della routine all'interno del file, tra virgolette ( "" )oppure Simbolo di cancelletto ( # ) seguito da un numero intero che specifica il numero ordinale del punto di ingresso della routine all'interno del relativo file |
parameterlist |
Obbligatorio se la routine accetta i parametri. Vedere Elenco parametri. |
returntype |
Obbligatorio se si specifica Function e Option Strict è On . Tipo di dati del valore restituito dalla routine. |
Osservazioni:
In alcuni casi è necessario chiamare una routine definita in un file, ad esempio una DLL o una risorsa del codice, all'esterno del progetto. In questo caso, il compilatore di Visual Basic non ha accesso alle informazioni necessarie per chiamare correttamente la routine, ad esempio dove si trova la routine, come viene identificata, la sequenza chiamante e il tipo restituito e il set di caratteri stringa utilizzato. L'istruzione Declare
crea un riferimento a una routine esterna e fornisce queste informazioni necessarie.
Si può usare Declare
solo a livello di modulo. In altri termini, il contesto della dichiarazione per un riferimento esterno deve essere una classe, una struttura o un modulo e non può essere un file di origine, uno spazio dei nomi, una routine o un blocco. Per altre informazioni, vedere Contesti delle dichiarazioni e livelli di accesso predefiniti.
Per impostazione predefinita, l'accesso dei riferimenti esterni è Pubblico. È possibile regolare i livelli di accesso con i modificatori di accesso.
Regole
Attributi. È possibile applicare gli attributi a un riferimento esterno. Qualsiasi attributo applicato ha effetto solo nel progetto, non nel file esterno.
Modificatori. Le routine esterne sono Shared in modo implicito. Non è possibile usare la parola chiave
Shared
quando si dichiara un riferimento esterno e non è possibile modificarne lo stato condiviso.Una routine esterna non può partecipare all'override, implementare i membri dell'interfaccia o gestire gli eventi. Di conseguenza, non è possibile usare la parola chiave
Overrides
,Overridable
,NotOverridable
,MustOverride
,Implements
oHandles
in un'istruzioneDeclare
.Nome della routine esterna. Non è necessario assegnare a questo riferimento esterno lo stesso nome (in
name
) del nome del punto di ingresso della routine all'interno del file esterno (aliasname
). È possibile usare una clausolaAlias
per specificare il nome del punto di ingresso. Ciò può essere utile se la routine esterna ha lo stesso nome di un modificatore riservato di Visual Basic o di una variabile, di una routine o di qualsiasi altro elemento di programmazione nello stesso ambito.Nota
I nomi dei punti di ingresso nella maggior parte delle DLL fanno distinzione tra maiuscole e minuscole.
Numero della routine esterna. In alternativa, è possibile utilizzare una clausola
Alias
per specificare il numero ordinale del punto di ingresso all'interno della tabella di esportazione del file esterno. A tale scopo, iniziarealiasname
con un simbolo di cancelletto (#
). Ciò può essere utile se un carattere nel nome della routine esterna non è consentito in Visual Basic o se il file esterno esporta la routine senza un nome.
Regole del tipo di dati
Tipi di dati dei parametri. Se
Option Strict
è impostato suOn
, è necessario specificare il tipo di dati di ogni parametro inparameterlist
. È possibile specificare qualsiasi tipo di dati o il nome di un'enumerazione, struttura, classe o interfaccia. All'interno diparameterlist
si usa una clausolaAs
per specificare il tipo di dati dell'argomento da passare a ogni parametro.Nota
Se la routine esterna non è stata scritta per .NET Framework, è necessario prestare attenzione alla corrispondenza dei tipi di dati. Ad esempio, se si dichiara un riferimento esterno a una routine di Visual Basic 6.0 con un parametro
Integer
(16 bit in Visual Basic 6.0), è necessario identificare l'argomento corrispondente comeShort
nell'istruzioneDeclare
, perché questo è il tipo Integer a 16 bit in Visual Basic. Analogamente,Long
ha una larghezza dei dati diversa in Visual Basic 6.0 eDate
viene implementata in modo diverso.Tipo di dati restituiti. Se la routine esterna è
Function
eOption Strict
è impostato suOn
, è necessario specificare il tipo di dati del valore restituito al codice chiamante. È possibile specificare qualsiasi tipo di dati o il nome di un'enumerazione, struttura, classe o interfaccia.Nota
Il compilatore di Visual Basic non verifica che i tipi di dati siano compatibili con quelli della routine esterna. In caso di mancata corrispondenza, Common Language Runtime genera un'eccezione MarshalDirectiveException in fase di esecuzione.
Tipi di dati predefiniti. Se
Option Strict
è impostato suOff
e non si specifica il tipo di dati di un parametro inparameterlist
, il compilatore di Visual Basic converte l'argomento corrispondente nel tipo di dati Object. Analogamente, se non si specificareturntype
, il compilatore accetta che il tipo di dati restituito siaObject
.Nota
Poiché si sta gestendo una routine esterna che potrebbe essere stata scritta in una piattaforma diversa, è pericoloso fare ipotesi sui tipi di dati o consentire loro di impostare l'impostazione predefinita. È molto più sicuro specificare il tipo di dati di ogni parametro e del valore restituito, se presente. Ciò migliora anche la leggibilità del codice.
Comportamento
Ambito. Un riferimento esterno rientra nell'ambito per tutta la sua classe, struttura o modulo.
Durata. Un riferimento esterno ha la stessa durata della classe, della struttura o del modulo in cui viene dichiarato.
Chiamata di una routine esterna. Si chiama una routine esterna allo stesso modo in cui si chiama una routine
Function
oSub
, usandola in un'espressione se restituisce un valore o specificandola in un'istruzione Call se non restituisce un valore.Gli argomenti vengono passati alla routine esterna esattamente come specificato da
parameterlist
nell'istruzioneDeclare
. Non prendere in considerazione il modo in cui i parametri sono stati originariamente dichiarati nel file esterno. Analogamente, se è presente un valore restituito, usarlo esattamente come specificato dareturntype
nell'istruzioneDeclare
.Set di caratteri. È possibile specificare in
charsetmodifier
il modo in cui Visual Basic deve effettuare il marshalling delle stringhe quando chiama la routine esterna. Il modificatoreAnsi
indirizza Visual Basic al marshalling di tutte le stringhe ai valori ANSI e il modificatoreUnicode
lo indirizza al marshalling di tutte le stringhe ai valori Unicode. Il modificatoreAuto
indirizza Visual Basic al marshalling delle stringhe in base alle regole di .NET Framework basate al riferimentoname
esterno oaliasname
, se specificato. Il valore predefinito èAnsi
.charsetmodifier
specifica inoltre come Visual Basic deve cercare la routine esterna all'interno del suo file esterno.Ansi
eUnicode
entrambi indirizzano Visual Basic a cercarlo senza modificarne il nome durante la ricerca.Auto
indirizza Visual Basic a determinare il set di caratteri di base della piattaforma di runtime ed eventualmente modificare il nome della routine esterna, come indicato di seguito:In una piattaforma Unicode, ad esempio Windows, cercare prima di tutto la routine esterna senza alcuna modifica del nome. Se la ricerca ha esito negativo, aggiungere "W" alla fine del nome della routine esterna e cercarlo di nuovo.
In una piattaforma ANSI cercare prima di tutto la routine esterna senza alcuna modifica del nome. Se la ricerca ha esito negativo, aggiungere "A" alla fine del nome della routine esterna e cercarlo di nuovo.
Meccanismo. Visual Basic usa il meccanismo platform invoke (PInvoke) di .NET Framework per risolvere e accedere a routine esterne. L'istruzione
Declare
e la classe DllImportAttribute usano entrambe questo meccanismo in modo automatico e non è necessaria alcuna conoscenza di PInvoke. Per altre informazioni, vedere Procedura dettagliata: chiamata delle API di Windows.
Importante
Se la routine esterna viene eseguita all'esterno di Common Language Runtime (CLR), si tratta di codice non gestito. Quando si chiama una routine di questo tipo, ad esempio una funzione delle API di Windows o un metodo COM, è possibile esporre l'applicazione a rischi per la sicurezza. Per altre informazioni, vedere Linee guida per la creazione di codice sicuro applicabili al codice non gestito.
Esempio 1
Nell'esempio seguente viene dichiarato un riferimento esterno a una routine Function
che restituisce il nome utente corrente. Viene chiamata poi la routine esterna GetUserNameA
come parte della routine 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
Esempio 2
DllImportAttribute fornisce un modo alternativo di usare le funzioni nel codice non gestito. Nell'esempio seguente viene dichiarata una funzione importata senza usare un'istruzione 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