我为 CAD/CAE 系统开发插件。我在 C# .NET 4.0 上编写它。我正在使用这个 CAD 系统中的 .dll-s,但我无法访问系统的源代码。
当我第一次执行插件时 - 它工作得很好。当插件第二次工作时 - 系统没有响应(“服务器忙,切换到”对话框)。
我检测到以下代码引发了 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 中的第二行引发了异常。事实上,第一行(theSession.ActiveSketch)抛出了 AccessViolationException。
当我第一次启动插件时,Session.ActiveSketch == null,但在第二次它抛出异常......但我从来没有使用过ActiveSketch!
下一步...当我逐步调试代码中的每一行时 - theSession.ActiveSketch == null!结果 - 插件有效。
下一步...当我在第 3、第 4、第 5 次执行插件时... - 插件有效并且 theSession.ActiveSketch 始终等于 null!在他第 3 次、第 4 次……我禁用了所有断点……
谁是凶手?问题出在哪里?