私は、ヘッダーファイルのみを持つC++ dllをラップしようとしています。私は、現時点では作業を取得しようとしている機能は私にAccessViolationException
を与えている:C#P/Invoke AccessViolationExceptionは、文字列パラメータを使用するattepting時
"Attempted to read or write protected memory.
This is often an indication that other memory is corrupt."
C++関数のプロトタイプは次のとおりです。
RunSimulation(LPCSTR, LPSTR);
一方、私のC#のラッパーです:
[DllImport("thedll.dll", EntryPoint = "RunSimulation")]
public static extern uint RunSimulation(string simID, ref string outputID);
私は問題がC#関数、特に文字列の実装方法にあると思われます。私はプラットフォームの呼び出しなどについて比較的新しいので、どのように進むべきかはわかりません。
文字列パラメータは、文字列のどこへのポインタであるべきですか?それともラッパーに何か間違っているのでしょうか?
編集:
これは、関数は、物事の管理最後に呼ばれている方法です。
string outputID = "";
try
{
RunSimulation(id, ref outputID);
}
catch (Exception e)
{
Logging.Log_Warning.SendException("Threw an exception", e);
}
編集2:
StringBuilder
に2つ目のパラメータを変更する際に同じ例外が発生します。唯一の違いは、例外ブレークが関数が呼び出された行で停止しないことです.Visual Studioは例外が発生したことを示す新しい「ブレーク」タブを開きます。関数のドキュメントでは、16バイト以上を設定することを推奨しています。そのため、容量コンストラクタを1024と4096の値でテストしました。
編集3:クリーンを行った後
と再構築、問題はドライバのエラーとしての地位を提示しました。これはAPIが機能していることを示しているため、解答では実際にはStringBuilder
に私のref string
パラメータを変更しました。
初期容量をいくつか設定して、(このコンストラクタを使用して)(https://msdn.microsoft.com/en-us/library/h1h0a5sy(v=vs.110))、第2パラメータとして 'StringBuilder'を使用してみてください。 .aspx?cs-save-lang = 1&cs-lang = csharp#code-snippet-1))。 –
引数は 'string simID、StringBuilder outputID'でなければなりません。このように' StringBuilder'の使用に関する無数の質問と記事を参照してください。呼び出し側は十分なメモリを割り当てる必要があります。呼び出す関数との契約では、その文字列のサイズを指定する必要があります。 –
あなたは、このような最小限の情報を得ることができるほど良い答えを得ています。さらに助けが必要な場合は、[mcve]を入力してください。この種のinteropが失敗する数え切れない他の方法があります。小さなコードを表示することは役に立ちません。 –