宣告外部檔案中實作之程序的參考。
語法
[ <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 ]
組件
| 術語 | 定義 |
|---|---|
attributelist |
選擇性。 請參閱屬性清單。 |
accessmodifier |
選擇性。 可以是下列其中一項: - 公共 - 保護 - 朋友 - 私人 - 受保護的Friend - 私人受保護 請參閱 Access levels in Visual Basic。 |
Shadows |
選擇性。 請參閱 Shadows。 |
charsetmodifier |
選擇性。 指定字元集和檔案搜尋資訊。 可以是下列其中一項: - Ansi (預設值) - Unicode - 自動 |
Sub |
選擇性,但 Sub 或 Function 必須出現。 表示外部程式不會傳回值。 |
Function |
選擇性,但 Sub 或 Function 必須出現。 表示外部程式會傳回值。 |
name |
必須的。 這個外部參考的名稱。 如需詳細資訊,請參閱 宣告的項目名稱。 |
Lib |
必須的。 引進 子 Lib 句,這個子句會識別包含外部程式的外部檔案(DLL 或程式代碼資源)。 |
libname |
必須的。 包含宣告程式的檔名。 |
Alias |
選擇性。 表示所宣告的程式無法透過 中指定的 name名稱在檔案中識別。 您可以在 中 aliasname指定其識別。 |
aliasname |
如果您使用 關鍵詞, Alias 則為必要項。 以下列兩種方式之一識別程式的字串:程式在其檔案內的進入點名稱,在引號內 ( "")-或- 數字符號 ( #) 後面接著一個整數,指定程式進入點在其檔案中的序數位 |
parameterlist |
如果程式接受參數,則為必要。 請參閱參數清單。 |
returntype |
如果 Function 已指定 且 Option Strict 為 ,則為 On必要項。 程式所傳回之值的數據類型。 |
備註
有時候,您需要在專案外部呼叫檔案中定義的程式(例如 DLL 或程式碼資源)。 當您這樣做時,Visual Basic 編譯程式無法正確呼叫程式所需的資訊,例如程式的所在位置、識別程式的方式、其呼叫順序和傳回類型,以及它所使用的字元串字元集。
Declare語句會建立外部程序的參考,並提供此必要資訊。
您只能在模組層級使用 Declare 。 這表示外部參考的 宣告內容 必須是類別、結構或模組,而且不能是來源檔案、命名空間、介面、程式或區塊。 如需詳細資訊,請參閱 宣告內容和預設存取層級。
外部參考預設為 公用 存取。 您可使用存取修飾詞來調整其存取層級。
規則
屬性。 您可以將屬性套用至外部參考。 您套用的任何屬性只會在您的專案中生效,而不是在外部檔案中。
修飾 符。 外部程式會隱含 共用。 在宣告外部參考時,您無法使用
Shared關鍵詞,而且無法改變其共享狀態。外部程式無法參與覆寫、實作介面成員或處理事件。 因此,您無法
Overrides在 語句中使用Declare、Overridable、NotOverridable、MustOverride、Implements或Handles關鍵詞。外部程式名稱。 您不需要為這個外部參考提供與程式外部檔案內進入點名稱相同的名稱(
aliasnameinname)。 您可以使用Alias子句來指定進入點名稱。 如果外部程式的名稱與 Visual Basic 保留修飾詞或變數、程式或相同範圍內的任何其他程式設計專案相同,這非常有用。備註
大部分 DLL 中的進入點名稱會區分大小寫。
外部過程編號。 或者,您可以使用
Alias子句來指定外部檔案匯出數據表內進入點的序數。 若要這樣做,您會從數字符號 (#) 開始aliasname。 如果 Visual Basic 中不允許外部程式名稱中的任何字元,或外部檔案匯出沒有名稱的程式,這非常有用。
數據類型規則
參數數據類型。 如果
Option Strict為On,您必須在 中parameterlist指定每個參數的數據類型。 這可以是任何數據類型或列舉、結構、類別或介面的名稱。 在 內parameterlist,您可以使用As子句來指定要傳遞至每個參數之自變數的數據類型。備註
如果未為 .NET Framework 撰寫外部程式,您必須負責數據類型的對應。 例如,如果您以參數宣告Visual Basic 6.0 程式
Integer的外部參考(Visual Basic 6.0中的16位),則必須在語句中Declare識別對應的自變數,Short因為這是Visual Basic中的16位整數類型。 同樣地,Long在 Visual Basic 6.0 中有不同的數據寬度,而且Date會以不同的方式實作。傳回數據類型。 如果外部程式是 ,且
Option Strict為FunctionOn,您必須指定傳回給呼叫程式代碼之值的數據類型。 這可以是任何數據類型或列舉、結構、類別或介面的名稱。備註
Visual Basic 編譯程式不會驗證您的數據類型是否與外部程式的數據類型相容。 如果不相符,Common Language Runtime 會在運行時間產生 MarshalDirectiveException 例外狀況。
默認數據類型。 如果
Option Strict是Off且您未在 中parameterlist指定參數的數據類型,則Visual Basic編譯程式會將對應的自變數轉換為 對象資料類型。 同樣地,如果您未指定returntype,編譯程式會採用傳回數據類型為Object。備註
因為您正在處理可能已在不同的平臺上撰寫的外部程式,所以對數據類型進行任何假設,或允許它們預設是危險的。 如果有的話,指定每個參數和傳回值的數據類型會更安全。 這也可改善程式代碼的可讀性。
行為
範圍。 外部參考在其類別、結構或模組的範圍內。
一生 外部參考的存留期與宣告它的類別、結構或模組具有相同的存留期。
呼叫外部程式。 呼叫外部程式的方式與呼叫
Function或Sub程式的方式相同,方法是在表達式中使用它傳回值,或在 呼叫語句 中指定它,如果它未傳回值,則為 。您會將自變數傳遞至外部程式,完全如 語句中所
Declare指定parameterlist。 請勿考慮參數最初在外部檔案中宣告的方式。 同樣地,如果有傳回值,請使用與 語句中指定的Declare完全相同returntype。字元集。 您可以在
charsetmodifierVisual Basic 呼叫外部程式時,指定如何封送處理字串。Ansi修飾詞會指示 Visual Basic 將所有字串封送處理至 ANSI 值,而Unicode修飾詞會將所有字串封送處理至 Unicode 值。Auto修飾詞會指示 Visual Basic 根據外部參考name,或aliasname指定時根據 .NET Framework 規則封送處理字串。 預設值是Ansi。charsetmodifier也會指定 Visual Basic 應如何查閱其外部檔案中的外部程式。Ansi和Unicode兩者都會直接查閱 Visual Basic,而不需在搜尋期間修改其名稱。Auto指示 Visual Basic 判斷運行時間平臺的基底字元集,並可能修改外部程式名稱,如下所示:在 Unicode 平臺上,例如 Windows,先查閱沒有名稱修改的外部程式。 如果失敗,請將 「W」 附加至外部程式名稱的結尾,然後再查閱一次。
在 ANSI 平臺上,先查閱沒有名稱修改的外部程式。 如果失敗,請將 「A」 附加至外部程式名稱的結尾,然後再查閱一次。
機制。 Visual Basic 使用 .NET Framework 平台調用 (PInvoke) 機制來解析和存取外部程式。
Declare語句和 DllImportAttribute 類別都會自動使用此機制,而且您不需要任何 PInvoke 的知識。 如需詳細資訊,請參閱 逐步解說:呼叫 Windows API。
這很重要
如果外部程式在 Common Language Runtime (CLR) 外部執行,則為 Unmanaged 程式代碼。 當您呼叫這類程式時,例如 Windows API 函式或 COM 方法,您可能會將應用程式公開給安全性風險。 如需詳細資訊,請參閱 Unmanaged 程式代碼的安全編碼指導方針。
範例 1
下列範例會宣告傳回目前用戶名稱之程式的外部參考 Function 。 然後,它會呼叫外部程式 GetUserNameA 做為程式的一 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
範例 2
DllImportAttribute提供在 Unmanaged 程式代碼中使用函式的替代方式。 下列範例會宣告匯入的函式,而不使用 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