CAD/CAEシステムへのプラグインを開発しています。C# .NET 4.0 で書いています。この CAD システムの .dll を使用していますが、システムのソース コードにアクセスできません。
初めてプラグインを実行すると、うまく機能します。プラグインが 2 回目に作業を行ったとき、システムは応答しません (「サーバーがビジーです。次へ」ダイアログボックス)。
次のコードが AccessViolationException をスローすることがわかりました (リスト 1)。
public class TestClass : IDisposable
{
private Session theSession;
private static readonly UI theUI = UI.GetUI();
private BlockDialog theDialog;
...
public TestClass()
{
theSession = Session.GetSession();
theDialog = theUI.CreateDialog(theDlxFileName); // throws exception in this line!
theDialog.AddApplyHandler(ApplyCb);
theDialog.AddOkHandler(OkCb);
theDialog.AddUpdateHandler(UpdateCb);
theDialog.AddInitializeHandler(InitializeCb);
theDialog.AddDialogShownHandler(DialogShownCb);
}
public DialogResponse Show()
{
theDialog.Show();
...
}
public void Dispose()
{
...
theDialog.Dispose();
...
}
public SomeOtherFunction(...)
{
...
theSession...
...
}
...
}
デバッガー (VS 2010 sp1) は、リスト 1 の 2 行目で例外がスローされることを示しています。実際、最初の行 (theSession.ActiveSketch) で AccessViolationException がスローされます。
初めてプラグインを起動すると、theSession.ActiveSketch == null になりますが、2 回目には例外がスローされます... しかし、私は ActiveSketch を使用したことがありません!
次...コードの各行を段階的にデバッグすると、theSession.ActiveSketch == null! その結果、プラグインが機能します。
次に... 3 回目、4 回目、5 回目にプラグインを実行すると... - プラグインが機能し、theSession.ActiveSketch は常に null に等しくなります! 3 回目、4 回目、... 回、すべてのブレークポイントを無効にしました...
殺人者は誰ですか?問題はどこだ?