ケース:
アンマネージ C コードを呼び出す .net アプリケーションがあります。これに使用される方法:
public static class MiracleCreator
{
[DllImport("Library.dll")]
private static extern void RunUnmanaged(string fileName);
public static void Run(string fileName)
{
RunUnmanaged(fileName);
}
}
これは Windows フォーム アプリケーションで使用され、必要なファイル名は OpenFileDialog によって取得されます。コード:
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
MiracleCreator.Run(openFileDialog.FileName);
}
問題:
Windows フォーム アプリケーションでコードを数回実行すると、openFileDialog が壊れて次の例外が表示されます。
解決策を探す場合:
OpenFileDialog の「より信頼性の高い」使用を試みても役に立ちません。このソリューションのように(リンクを提供しようとしましたが、「新しいユーザーはハイパーリンクを追加できません」:)):
public class Invoker
{
public OpenFileDialog InvokeDialog;
private Thread InvokeThread;
private DialogResult InvokeResult;
public Invoker()
{
InvokeDialog = new OpenFileDialog();
InvokeThread = new Thread(new ThreadStart(InvokeMethod));
InvokeThread.SetApartmentState(ApartmentState.STA);
InvokeResult = DialogResult.None;
}
public DialogResult Invoke()
{
InvokeThread.Start();
InvokeThread.Join();
return InvokeResult;
}
private void InvokeMethod()
{
InvokeResult = InvokeDialog.ShowDialog();
}
}
使用法 :
Invoker I = new Invoker();
if (I.Invoke() == DialogResult.OK)
{
MessageBox.Show(I.InvokeDialog.FileName, "Test Successful.");
}
else
{
MessageBox.Show("Test Failed.");
}
質問:
例外は本当にアンマネージ コードが原因ですか? 他の可能性のある問題 (OpenFileDialog とは異なるものを壊す) が予想されますか? これに対するより良いアプローチは何ですか?
すべてのアイデア/ソリューションに感謝します。