我开发了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。
当我第一次启动插件时,theSession.ActiveSketch == null,但是第二次抛出异常......但我从不使用ActiveSketch!
下一步...当我逐步调试代码中的每一行时 - theSession.ActiveSketch == null!结果 - 插件工作。
下一步......当我在第3次,第4次,第5次执行插件时... - 插件工作,而theSession.ActiveSketch总是等于null!在他第3,第4,...时,我禁用了所有断点......
谁是杀手?问题出在哪里?