私は、その関数にアクセスするために、DllImport
を使用してクラスにラップしたサードパーティのC++ dllへの呼び出しに問題があります。try-catch-finallyブロックを構成して、最終的にエラーを処理するにはどうすればよいですか?
dllは、使用前にセッションが開かれることを要求します。これは、操作を実行するときにそのセッションを参照するために使用される整数ハンドルを返します。終了したら、同じハンドルを使用してセッションを終了する必要があります。だから私はこのような何かをした:
public void DoWork(string input)
{
int apiHandle = DllWrapper.StartSession();
try
{
// do work using the apiHandle
}
catch(ApplicationException ex)
{
// log the error
}
finally
{
DllWrapper.CloseSession(apiHandle);
}
}
私が持っている問題はCloseSession()は時々、ねじを実行しているときにエラーをスローする問題のDLLを引き起こすことがある:
System.AggregateException:1つ以上のエラーが発生しました。 ---> System.AccessViolationException:保護された メモリを読み書きしようとしました。これはしばしば、他のメモリが壊れていることを示します。
Dllをスレッド方式で使用しているように見えるので、私はこのエラーを停止することができません。スレッドセーフであると思われます。しかし、私のCloseSession()関数は、Dllのクローズ関数を呼び出す以外は何もしないので、何かを "修正"する余裕があまりありません。
しかし、最終的にはセッションが正常に終了しないことになります。だから、プロセスがやり直さなければならないプロセスは、オープンセッションに遭遇し、新しいエラーを投げつけ続けます。そのセッションは絶対にに閉鎖されるを持っています。
エラー処理ステートメントを設計する方法について、私は紛失しています。これは、セッションが常に閉じることを保証するものです。
私は疑問に思うのですが、どのようにエラーを "処理"する必要がありますか?セッションを終了するとサードパーティのコードからエラーが発生し、セッションを終了せずに処理を続けることができない場合は、次に何を行いますか?つまり、 'finally /'の中に別の 'try/catch'を置くことができますが、実際にエラーにどのように反応しますか?サードパーティのツールが動作していない場合、何ができるのですか? – David
これがスレッディングによって発生した場合は、StartSessionを中心に[lock(){}](https://msdn.microsoft.com/en-us/library/c5kehkcz.aspx)ステートメントを使用して問題を回避できます()メソッドとCloseSession()メソッドを呼び出します。 – Serge
@Davidサードパーティのツールが失敗するのは断続的です。もう一度試してみると通常はうまくいきます。私の実際のコードは現在、これが常に起こることを確実にしようとする再帰と制御フローのひどい混乱です。私はもっと嫌いですが、もし私がする必要があれば、私はする必要があります:( –