C#使用DllImport調用非託管的代碼的方法

來源:互聯網
上載者:User

找到GetShortPathName的方法簽名,

DWORD GetShortPathName(LPCTSTR tpszLongPath,TPTSTR lpszShortPath,DWORD cchBuffer);

非託管及管理的資料類型對應關係:

LPCTSTR String

LPTSTR StringBuilder

DWORD int

DllImport的匯入規則:

1、方法名與Win API完全一樣。如果在C#中調用時顯示完全不同的方法名稱,則需要引入EntryPoint屬性,使用別名顯示。

2、函數除需要DllImport類修飾符外,還需要聲明public static extern類型。

3、函數傳回值和參數必須和調用的API的完全一樣。

4、必須引入System.Runtime.InteropServices命名空間。

代碼:

複製代碼 代碼如下:using System.Runtime.InteropServices;

public class Test

{

[DllImport("kernel32.dll",CharSet=CharSet.Auto,EntryPoint="GetShort")]

public static extern int GetShortPathName(

[MarshalAs(UnmanagedType.LPTStr)] String path,

[MarshalAs(UnmanagedType.LPTStr)] StringBuilder shortPath,

int shortPathLength);

}

代碼調用中kernel32.dll的路徑之所以沒寫是因為DllImport會按照以下三種順序尋找Dll:

1、exe所在目錄;2、System32目錄;3、環境變數目錄。

MarshalAs為可選類型,因為每個資料類型都有預設的封送行為,該屬性指示如何在Managed 程式碼和Unmanaged 程式碼之間的封送資料,可將該屬性用於參數、欄位和傳回值。大多數情況下該屬性只是用UnmanagedType枚舉類型就能滿足大多數非託管的資料類型,如預設情況下字元會被當作BStr傳入到Dll中,可以使用MarshalAs將字串指定為LPTStr、LPWStr或LPStr等。

DllImport可選屬性解釋

EntryPoint 可對方法採用不同的名稱,使用別名

CharSet 函數調用使用Unicode還是Ansi

ExactSpelling False,表示讓編譯器自己選擇使用Unicode或Ansi

CallingConvetnion 它的參數指示進入點調用的約定;不指定預設為CallingConvention.WinAPI

PreserveSig 指示方法簽名應當被保留還是被轉換,當被轉換時它被轉換為一個具有HRESULT傳回值和該傳回值的一個名為retval的附加輸出參數的簽名,預設為true。

SetLastError 指定是否保留上一次錯誤,預設為false

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.