共用方式為


使用非管理 DLL 函式

平台調用是一項服務,可讓受控代碼呼叫在動態連結庫(DLL)中實作的非受控函式,例如 Windows API 中的函式。 它會定位並調用已導出的函式,並在需要時將其參數(如整數、字串、陣列、結構等)跨越互操作邊界進行封送處理。

本節介紹與使用非受控 DLL 函式相關聯的工作,並提供有關平台調用的詳細資訊。 除了下列任務之外,還有一些整體考量,以及提供更多資訊和範例的連結。

若要取用導出的 DLL 函式

  1. 識別 DLL 中的函式

    您至少必須指定函式的名稱,以及包含它的 DLL 名稱。

  2. 建立類別來保存 DLL 函式

    您可以使用現有的類別、為每個 Unmanaged 函式建立個別類別,或建立一個包含一組相關 Unmanaged 函式的類別。

  3. 在受管控的程式碼中建立原型

    [Visual Basic] 使用 Declare 語句,搭配 FunctionLib 關鍵詞。 在某些情況下,您可以使用 DllImportAttribute 搭配 Shared Function 關鍵詞。 本節稍後會說明這些案例。

    [C#]使用 DllImportAttribute 來識別 DLL 和函式。 使用 靜態外部 修飾詞標記該方法。

    [C++]使用 DllImportAttribute 來識別 DLL 和函式。 使用 extern “C” 標記包裝函式方法或函式。

  4. 呼叫 DLL 函式

    對管理的類別中的方法進行呼叫,就像對任何其他管理的方法一樣。 傳遞結構和實作回呼函式是特殊案例。

如需示範如何建構基於.NET的宣告以搭配平台調用使用的範例,請參閱 使用平台調用封送數據

進一步瞭解平台調用

平台調用依賴元數據來定位導出的函式,並在執行階段封送其參數。 下圖顯示這項程序。

顯示平台調用呼叫的圖表。

當平台調用呼叫 Unmanaged 函式時,它會執行下列動作序列:

  1. 找出包含函式的 DLL。

  2. 將 DLL 載入記憶體。

  3. 在記憶體中找到函式的位址,將其參數推送至堆疊,並根據需要處理數據。

    備註

    尋找和載入 DLL,並在記憶體中尋找函式的位址只會發生在函式的第一次呼叫上。

  4. 將控制權傳輸至非受控函式。

平台調用會將非受控函式所產生的例外擲回給受控呼叫端。

另請參閱