複数の関数を実装するDLLとのインターフェイスを試行していますが、そのうちの1つはnullで終了する文字列とintをとり、NULLで終了する文字列を返します。私はこれをしようとしたとき、AccessViolationException
は、私は私に言って投げている、しかしDllImport nullで終了した文字列を返すAccessViolationException
StringBuilder message = new StringBuilder(1000);
StringBuilder out2 = new StringBuilder(1000);
out2 = GetErrorMessage(message, res0);
:
[DllImport(dll_loc)]
[return : MarshalAs(UnmanagedType.LPStr)]
public static extern StringBuilder GetErrorMessage([MarshalAs(UnmanagedType.LPStr)]
StringBuilder message,
int error_code);
は、私は、このようなメソッドを呼び出そう:私はこのような方法とのインタフェースしようとしてきました保護されたメモリにアクセスしようとしています。
は、私は、次のようなさまざまな方法を宣言することに成功した:[DllImport(dll_loc)]
public static extern int GetVersion([MarshalAs(UnmanagedType.LPStr)]
StringBuilder version);
と同じようにそれを呼び出すことが、この方法は、現在の関数呼び出しのために動作しません。
また、技術的には、メソッドが文字列バッファの最初の文字へのポインタを返しますが、役に立たないと書かれているので、IntPtrを返そうとしました。
ここで間違っている可能性のある人はいますか? dllがメモリにアクセスしようとしている原因となっているこれらの2つの方法の違いは何か。あるいは、この問題をデバッグすることをどうお勧めしますか?
いくつかのWindows DLLをピンボケするときに同様の問題が発生しました。私は、パラメータのいくつかの小さな微調整によって大きな改善が見出されたことを知りました。やや間違った整列/データ型/ etc。大きな違いがあります。アンマネージDLLインターフェイスのドキュメントを実際に詳しく見ていく必要があります。 –