0

我为 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 次……我禁用了所有断点……

谁是凶手?问题出在哪里?

4

0 回答 0