當我對本機函數進行 P/Invoke 時,爲什麼會產生“NotSupportedException”?

有三種常見的可能:

  • 託管代碼中的聲明不正確

  • .NET Compact Framework 不支持您試圖要做的事情

  • 在導出時改變 dll 名稱

請檢查以下情況:

  • 是否違背任何 .NET Compact Framework P/Invoke 限制?

  • 是否有參數需要預分配內存(即,參數是指針)?如果是這樣,您就應該將一個引用傳遞給現有的變量。

  • 導出函數的名稱是否正確?可以通過 DUMPBIN.EXE 來驗證

  • 您是否試圖傳遞過多參數?

例如,在以上的第二種情況,RegOpenKey API 需要一個指向 HKEY 的指針作爲它的最後一個參數。您可以按照以下方式聲明和調用它:

//C#

[DllImport("coredll.dll", SetLastError=true)]
public static extern long RegOpenKey(
    IntPtr hkey,
    string lpSubKey,
    ref IntPtr hkeyResult
);

public long OpenMySubKey()
{
    IntPtr hkey = IntPtr.Zero;
    return RegOpenKey(HKEY_CLASSES_ROOT, "MySubKey", ref hkey);
}

'VB

 _
Public Shared Function RegOpenKey(ByVal hkey As IntPtr, ByVal lpSubKey As String, _
  ByRef hkeyResult As IntPtr) As Long
End Function

Public Function OpenMySubKey() As Long
    Dim hkey As IntPtr = IntPtr.Zero
    Return RegOpenKey(HKEY_CLASSES_ROOT, "MySubKey", hkey)
End Function 'OpenMySubKey
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章