2017-01-20 1 views
0

私は、ヘッダーファイルのみを持つ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パラメータを変更しました。

+1

初期容量をいくつか設定して、(このコンストラクタを使用して)(https://msdn.microsoft.com/en-us/library/h1h0a5sy(v=vs.110))、第2パラメータとして 'StringBuilder'を使用してみてください。 .aspx?cs-save-lang = 1&cs-lang = csharp#code-snippet-1))。 –

+2

引数は 'string simID、StringBuilder outputID'でなければなりません。このように' StringBuilder'の使用に関する無数の質問と記事を参照してください。呼び出し側は十分なメモリを割り当てる必要があります。呼び出す関数との契約では、その文字列のサイズを指定する必要があります。 –

+2

あなたは、このような最小限の情報を得ることができるほど良い答えを得ています。さらに助けが必要な場合は、[mcve]を入力してください。この種のinteropが失敗する数え切れない他の方法があります。小さなコードを表示することは役に立ちません。 –

答えて

0

私の問題の解決策は、Stringの代わりにStringBuilderを使用して、メモリ内のスペースが事前に割り当てられていることを確認することになりました。だから私の署名は、次のように見てしまった:

[DllImport("thedll.dll", EntryPoint = "RunSimulation")] 
public static extern uint RunSimulation(string simID, StringBuilder outputID); 

そして、それを使用する:助け

string id = "someID"; 
int requiredSize = 512; 
StringBuilder outputID = new StringBuilder(requiredSize); 

RunSimulation(id, outputID); 

希望を!

関連する問題