2017-01-09 34 views
0

我有一個nuget從一個C++項目形成 - 在那個nuget我有一個extern方法GetBytes裏面的靜態類FileAccess.cs,我調用另一個項目的(C#)REST服務調用檢索一些數據。每當我從我的C#REST服務中調用這個GetBytesextern方法時,出於某種原因,我得到一個AccessViolationException。該方法需要兩個字符串和幾個int值並返回IntPtrAccessViolationException直接調用extern方法時

我很困惑,因爲我有一個類似的調用不會導致違規。關鍵的區別是這個版本不直接調用extern方法。相反,它調用一個C#DataGroup類(它是nuget的一部分),它包含一個調用extern方法的函數。 DataGroup類方法返回一個byte[,],但僅在它調用extern方法並編組數據後。

//導致AccessViolation版本:

  1. REST調用的extern方法IntPtrIntPtr ptr = FileAccess.getBytes(...);
  2. 的extern方法返回IntPtr
  3. AccessViolationException發生

//工作版本與特級:

  1. REST調用數據組方法返回byte[,]。 (例如dataGroupInstance.getDataGroupBytes();
  2. 的extern方法被稱爲內部方法getDataGroupBytes
  3. 的extern方法返回IntPtr
  4. 方法getDataGroupBytes警數據從IntPtr並返回一個byte[,]
  5. 沒有錯誤

基本上,這是爲什麼調用extern方法直接產生一個AccessViolationException

+0

如果您的'FileAccess.getBytes(...);'方法使用可變參數,請確保在PInvoke簽名上設置'CallingConvention.Cdecl'。 – Peter

回答

0

想通了。這個問題是我的參數造成的 - 當我應該使用const char*時,我的C++函數使用std::string。我用const char*替換std::string(它們用作參數的地方)的所有實例,我不再收到異常。

相關問題