適用于: Microsoft® .NET Framework 精簡版 1.0 Microsoft Visual Studio® .NET 2003 Microsoft eMbedded Visual C++® 3.0 摘要:學習如何創建可通過平臺調用在智能設備應用程序中使用的非托管函數。 目錄簡介編寫 Microsoft .NET Framework 精簡版應用程序時,有時需要調用非托管代碼,才能直接與底層操作系統進行交互。.NET Framework 精簡版中的非托管代碼和托管代碼之間的互操作性是 .NET Framework 完整版的子集。例如,.NET Framework 精簡版不支持將代理用作回調函數。同樣,.NET Framework 精簡版也不支持完整的 COM 互操作性,因此,如果要在 .NET Framework 精簡版中訪問 COM 對象,必須編寫非托管模塊以將其作為包裝程序,這樣才能處理對 COM 對象和類型封送處理的調用。 編寫從托管環境調用的非托管代碼時,有幾個問題需多加注意。本文介紹了這些注意事項,并提供了非托管動態鏈接庫 (DLL) 的代碼。 本文假定您熟悉 eMbedded Visual C++ 開發環境并了解 C++ 語言。 選擇 eMbedded Visual C++ 3.0 項目類型使用 eVC++ 時,您可以選擇使用 WCE 動態鏈接庫項目類型,也可以選擇 WCE MFC 應用程序向導 (dll) 項目類型。前者用于簡單的 DLL 項目,后者用于需要 Microsoft 基礎類 (MFC) 功能的項目。為了說明有關開發在 .NET Framework 精簡版中使用的非托管 DLL 的要點,本文將介紹如何使用 WCE 動態鏈接庫項目類型。 托管代碼只需要編譯一次,就可以在安裝了 .NET Framework 精簡版運行時的任何移動設備上運行;非托管代碼與之不同,必須為要支持的每個硬件平臺編譯單獨的 DLL。在新建項目對話框中,必須選擇希望在 DLL 中支持的處理器,eVC++ 將為每個選定的處理器平臺編譯單獨的 DLL。eVC++ 編譯器能夠支持各種處理器,包括 ARM、MIPS、SH 和 x86。必須記住,要在模擬器中使用 DLL,您可能需要創建 Intel x86 版本的 DLL。 導出入口點可以從 DLL 外部調用的任何函數都必須標記為導出函數。在 eVC++ 中,這可以通過為函數聲明添加 _declspec(dllexport) 前綴來實現。此外,按照 WINAPI 調用約定來標記函數聲明也很有用,因為這是 .NET Framework 精簡版所支持的唯一調用約定。WINAPI 宏映射到 __cdecl 調用約定。同樣,在 .NET Framework 精簡版中,CallingConvention.Winapi 等同于托管的 WINAPI。 以下示例顯示了使用以上技術時 eVC++ 中的函數聲明的外觀: _declspec(dllexport) int WINAPI MyFunction(int MyVal) { // 在此處添加實現代碼 return 0; } 從托管代碼中調用此代碼時,要按照以下格式聲明代碼中的非托管函數: [DllImport("NativeDll.dll",EntryPoint="MyFunction")] public static extern int MyFunction(int MyVal); 遺憾的是,由于“名稱混成”的原因,此調用無法按照預期的方式進行。 處理 C++ 名稱混成在 Windows 的早期版本中,對象文件格式無法處理重載函數。為解決此問題,編譯器根據函數名稱和參數列表為每個函數生成一個唯一名稱。這樣就確保了每個函數對鏈接器都有一個唯一的名稱。這種生成唯一名稱的方法就叫做“名稱混成”。MyFunction 的混成形式類似于 ?MyFunction@@YAJXZ。 名稱混成為要調用非托管代碼的托管代碼帶來一個問題。每個編譯器以不同的方式處理混成,因此很難了解導出入口點的確切名稱。在 C++ 中,可以使用 extern "C" 聲明強制編譯器不進行名稱混成,而是使導出函數的名稱與源代碼中的函數名稱相匹配。 使用 extern "C" 聲明時,C++ 函數示例如下所示: extern "C" _declspec(dllexport) int WINAPI multiply(int n1, int n2) { // 返回 n1 和 n2 相乘后的值 return(n1 * n2) } 類型封送處理.NET Framework 精簡版支持托管代碼與非托管代碼之間的簡單類型轉換。有些類型不需要任何轉換,這些類型稱為“通用類型”。下表顯示了可通用類型及其托管和非托管的等價類型。
此外,您還可以將數組、結構和類傳遞給非托管代碼。 更多信息有關更多信息,請參閱以下資源: |
文章來源于領測軟件測試網 http://www.kjueaiud.com/