我想與一個Dll實現幾個函數接口,其中一個接受一個空終止的字符串和一個int,並返回一個空終止的字符串。我試圖用這樣的方法接口:DllImport返回null終止字符串AccessViolationException
[DllImport(dll_loc)]
[return : MarshalAs(UnmanagedType.LPStr)]
public static extern StringBuilder GetErrorMessage([MarshalAs(UnmanagedType.LPStr)]
StringBuilder message,
int error_code);
我再嘗試調用這樣的方法:
StringBuilder message = new StringBuilder(1000);
StringBuilder out2 = new StringBuilder(1000);
out2 = GetErrorMessage(message, res0);
然而,當我嘗試這一點,AccessViolationException
拋出告訴我,我是試圖訪問受保護的內存。
我是成功的在聲明不同的方法,如:
[DllImport(dll_loc)]
public static extern int GetVersion([MarshalAs(UnmanagedType.LPStr)]
StringBuilder version);
,把它以同樣的方式,但這種方法不適用於當前函數調用運行。
我也試過返回一個IntPtr,因爲文檔技術上說該方法返回一個指向字符串緩衝區的第一個字符的指針,但無濟於事。
有沒有人對這裏可能出現的問題有所瞭解?這兩種方法可能會導致dll嘗試訪問它不應該訪問的內存。或者,你會如何建議去調試這個問題?
在禁止某些Windows DLL時遇到類似問題。我發現參數中的一些小調整導致了巨大的改進。即使是一些錯誤的編組/數據類型/等等。造成巨大的分歧。你必須仔細看看你的非託管DLL接口的文檔。 –