我有一個nuget從一個C++項目形成 - 在那個nuget我有一個extern方法GetBytes
裏面的靜態類FileAccess.cs,我調用另一個項目的(C#)REST服務調用檢索一些數據。每當我從我的C#REST服務中調用這個GetBytes
extern
方法時,出於某種原因,我得到一個AccessViolationException
。該方法需要兩個字符串和幾個int值並返回IntPtr
。AccessViolationException直接調用extern方法時
我很困惑,因爲我有一個類似的調用不會導致違規。關鍵的區別是這個版本不直接調用extern方法。相反,它調用一個C#DataGroup類(它是nuget的一部分),它包含一個調用extern方法的函數。 DataGroup類方法返回一個byte[,]
,但僅在它調用extern方法並編組數據後。
//導致AccessViolation版本:
- REST調用的extern方法
IntPtr
(IntPtr ptr = FileAccess.getBytes(...);
- 的extern方法返回
IntPtr
AccessViolationException
發生
//工作版本與特級:
- REST調用數據組方法返回
byte[,]
。 (例如dataGroupInstance.getDataGroupBytes();
- 的extern方法被稱爲內部方法
getDataGroupBytes
- 的extern方法返回
IntPtr
- 方法
getDataGroupBytes
警數據從IntPtr
並返回一個byte[,]
- 沒有錯誤
基本上,這是爲什麼調用extern方法直接產生一個AccessViolationException
?
如果您的'FileAccess.getBytes(...);'方法使用可變參數,請確保在PInvoke簽名上設置'CallingConvention.Cdecl'。 – Peter