首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 呼叫 DLL 技巧:DllImport 屬性、CallingConvention、型別對應與 Win32 API 實例

     編輯:關於C語言

基本宣告模式

public class Utility
{
    // 完整屬性寫法
    [DllImport("kernel32",
        EntryPoint = "CreateDirectory",
        CallingConvention = CallingConvention.StdCall,
        CharSet = CharSet.Auto)]
    public static extern bool CreateDirectory(string path);

    // 簡寫:預設 StdCall、Ansi、EntryPoint 同方法名
    [DllImport("user32", CharSet = CharSet.Auto)]
    public static extern int MessageBox(IntPtr hWnd, string text, string caption, int type);
}

關鍵屬性說明

屬性預設值說明
CallingConventionStdCallWin32 API 幾乎皆為 StdCall;C 執行期函式 (cdecl) 需明確指定。
CharSetAnsi控制字串封送與函數名修飾。建議 CharSet.Auto 或 Unicode。
EntryPoint方法名C# 方法名與 DLL 匯出名不同時必須指定。
SetLastErrorfalsetrue 時可用 Marshal.GetLastWin32Error() 取得錯誤碼。

Win32 API 型別對應實例

原型:BOOL CreateDirectory(LPCTSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);

[DllImport("kernel32", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool CreateDirectory(string lpPathName, IntPtr lpSecurityAttributes);

// 呼叫
bool ok = CreateDirectory(@"C:\NewFolder", IntPtr.Zero);
  • LPCTSTR → string (配合 CharSet.Auto 自動轉 Unicode/ANSI)。
  • LPSECURITY_ATTRIBUTES → IntPtr (傳 IntPtr.Zero 表示 NULL)。
  • 結構體需 [StructLayout(LayoutKind.Sequential)] 並逐欄位對應。

呼叫自訂 C++ DLL 注意事項

  1. C++ 函數需 extern "C" __declspec(dllexport) 避免名稱修飾。
  2. 呼叫慣例:C++ 預設 __cdecl,需在 C# 指定 CallingConvention.Cdecl,或在 C++ 加 __stdcall。
  3. 字串緩衝區:C++ 寫入字串時,C# 必須預先配置 StringBuilder 並傳遞容量。
  4. 記憶體管理:誰配置誰釋放。C++ 配置記憶體需提供釋放函數,C# 呼叫釋放。

除錯技巧

  • 啟用非受控偵錯:專案屬性 → Debug → 勾選「啟用非受控程式碼偵錯」。
  • SetLastError = true + Marshal.GetLastWin32Error() 取得 Win32 錯誤碼。
  • 使用 pinvoke.net 查詢標準 API 簽章。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved