2016-04-21 92 views
1

我使用P/Invoke與設備進行接口連接。但是我來被困在調用下面的方法:c#使用P/Invoke導致AccessViolation的調用方法異常

BOOL __stdcall voGetFirmwareVersion(IN OUT LPTSTR lpVersion, IN OUT DWORD *dwSize); 

在我的包裝我呼籲,像這樣的方法:

[DllImport(DLL_LOCATION, CharSet = CharSet.Ansi)] 
private static extern Boolean voGetFirmwareVersion(string s, uint d); 

我曾嘗試輸入變爲Out /參考,並試圖添加[In,Out]屬性,但我經常會遇到AccessViolation異常。任何人都可以將我指向正確的方向嗎?我已經在這了幾個小時,現在和谷歌一直沒有能夠把我一下子

+0

你運行具有管理員權限的計劃? –

+1

你在調用unicode的庫嗎?然後Charset.Ansi將是錯誤的。而第二個參數definitelly需要參考。 – PMF

+1

嘗試使用「StringBuilder」而不是「字符串」。 –

回答

3
  • dwSize被轉交地址,所以它應該是一個ref參數。如果任何非零值可能會作爲一個真正的價值
  • 我不知道,如果你真的想用Ansi字符集
  • BOOL返回類型必須編組。嘗試AutoUnicode
  • LPStrStdCall不是必須的,它們是默認設置。

那麼試試這個:

[DllImport(DLL_LOCATION, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
[return: MarshalAs(UnmanagedType.Bool)] 
private static extern bool voGetFirmwareVersion([MarshalAs(UnmanagedType.LPTStr)] string s, ref uint d); 
+0

乾杯taffer,我得到了來自Eren和PMF的答案,但由於解釋,我將其標記爲我的答案。 –

相關問題