Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 |
Opzionale. Vedere Elenco attributi. |
accessmodifier |
Opzionale. Può essere uno dei seguenti: - Pubblico - Protetto - Amico - Privato - Amico protetto - Privato protetto Vedere Livelli di accesso in Visual Basic. |
Shadows |
Opzionale. Vedi Ombre. |
charsetmodifier |
Opzionale. Specifica le informazioni sul set di caratteri e sulla ricerca di file. Può essere uno dei seguenti: - Ansi (impostazione predefinita) - Unicode - Automatico |
Sub |
Facoltativo, ma Sub o Function deve essere visualizzato. Indica che la routine esterna non restituisce un valore. |
Function |
Facoltativo, ma Sub o Function deve essere visualizzato. 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 Lib clausola che identifica il file esterno (DLL o risorsa di codice) che contiene una routine esterna. |
libname |
Obbligatorio. Nome del file che contiene la routine dichiarata. |
Alias |
Opzionale. Indica che la routine dichiarata non può essere identificata all'interno del relativo file dal nome specificato in name . Specificare l'identificazione in aliasname . |
aliasname |
Obbligatorio se si usa la Alias parola chiave . 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 Segno di numero ( # ) 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 procedura accetta parametri. Vedere Elenco di parametri. |
returntype |
Obbligatorio se Function è specificato 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 di codice, all'esterno del progetto. In questo caso, il compilatore 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.
È possibile usare Declare
solo a livello di modulo. Ciò significa che il contesto di 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, un'interfaccia, una routine o un blocco. Per altre informazioni, vedere Contesti di dichiarazione e livelli di accesso predefiniti.
Per impostazione predefinita, i riferimenti esterni sono Accesso pubblico . È possibile regolare i livelli di accesso con i modificatori di accesso.
Regole
Attributi. È possibile applicare attributi a un riferimento esterno. Qualsiasi attributo applicato ha effetto solo nel progetto, non nel file esterno.
Modificatori. Le procedure esterne sono condivise in modo implicito. Non è possibile usare la
Shared
parola chiave quando si dichiara un riferimento esterno e non è possibile modificarne lo stato condiviso.Una procedura esterna non può partecipare all'override, implementare i membri dell'interfaccia o gestire gli eventi. Di conseguenza, non è possibile usare la
Overrides
parola chiave ,NotOverridable
Overridable
,MustOverride
,Implements
, oHandles
in un'istruzioneDeclare
.Nome procedura 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 unaAlias
clausola 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.Annotazioni
I nomi dei punti di ingresso nella maggior parte delle DLL fanno distinzione tra maiuscole e minuscole.
Numero procedura esterna. In alternativa, è possibile utilizzare una
Alias
clausola per specificare il numero ordinale del punto di ingresso all'interno della tabella di esportazione del file esterno. A tale scopo, iniziarealiasname
con un segno di numero (#
). 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
èOn
, è necessario specificare il tipo di dati di ogni parametro inparameterlist
. Può trattarsi di qualsiasi tipo di dati o nome di un'enumerazione, struttura, classe o interfaccia. All'internoparameterlist
di si usa unaAs
clausola per specificare il tipo di dati dell'argomento da passare a ogni parametro.Annotazioni
Se la procedura 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
Integer
parametro (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 restituito. Se la routine esterna è e
Function
Option Strict
èOn
, è necessario specificare il tipo di dati del valore restituito al codice chiamante. Può trattarsi di qualsiasi tipo di dati o nome di un'enumerazione, struttura, classe o interfaccia.Annotazioni
Il compilatore Visual Basic non verifica che i tipi di dati siano compatibili con quelli della procedura esterna. In caso di mancata corrispondenza, Common Language Runtime genera un'eccezione MarshalDirectiveException in fase di esecuzione.
Tipi di dati predefiniti. Se
Option Strict
èOff
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 il tipo di dati restituito comeObject
.Annotazioni
Poiché si sta gestendo una procedura 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 in tutta la relativa classe, struttura o modulo.
Durata della vita. Un riferimento esterno ha la stessa durata della classe, della struttura o del modulo in cui viene dichiarata.
Chiamata di una routine esterna. Si chiama una routine esterna allo stesso modo in cui si chiama una
Function
routine oSub
, usandola in un'espressione se restituisce un valore o specificandola in un'istruzione call se non restituisce un valore.Si passano argomenti 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
che modo Visual Basic deve effettuare il marshalling delle stringhe quando chiama la routine esterna. IlAnsi
modificatore indirizza Visual Basic al marshalling di tutte le stringhe ai valori ANSI e ilUnicode
modificatore lo indirizza al marshalling di tutte le stringhe ai valori Unicode. IlAuto
modificatore indirizza Visual Basic al marshalling delle stringhe in base alle regole di .NET Framework in base al riferimentoname
esterno oaliasname
, se specificato. Il valore predefinito èAnsi
.charsetmodifier
specifica inoltre come Visual Basic deve cercare la routine esterna all'interno del relativo 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 procedura esterna senza alcuna modifica del nome. In caso di errore, aggiungere "W" alla fine del nome della procedura esterna e cercarlo di nuovo.
In una piattaforma ANSI cercare prima di tutto la procedura esterna senza alcuna modifica del nome. In caso di errore, aggiungere "A" alla fine del nome della routine esterna e cercarlo di nuovo.
Meccanismo. Visual Basic usa il meccanismo PInvoke ( Platform Invoke ) di .NET Framework per risolvere e accedere a procedure esterne. L'istruzione
Declare
e la DllImportAttribute classe usano questo meccanismo automaticamente e non è necessaria alcuna conoscenza di PInvoke. Per altre informazioni, vedere Procedura dettagliata: Chiamata alle API di Windows.
Importante
Se la procedura esterna viene eseguita all'esterno di Common Language Runtime (CLR), si tratta di codice non gestito. Quando si chiama una procedura di questo tipo, ad esempio una funzione API Di Windows o un metodo COM, è possibile esporre l'applicazione a rischi per la sicurezza. Per altre informazioni, vedere Secure Coding Guidelines for Unmanaged Code .For more information, see Secure Coding Guidelines for Unmanaged Code.
Esempio 1
Nell'esempio seguente viene dichiarato un riferimento esterno a una Function
routine che restituisce il nome utente corrente. Chiama quindi la procedura GetUserNameA
esterna come parte della getUser
procedura.
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
fornisce DllImportAttribute 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