代码之家  ›  专栏  ›  技术社区  ›  Traveling Tech Guy

停止时,Visual Studio项目保持“卡住”

  •  1
  • Traveling Tech Guy  · 技术社区  · 14 年前

    目前正在开发HP质量中心的连接器DLL。我正在使用他们的(插入experiative)COM API连接到服务器。互操作包装由vstudio自动创建。

    我的解决方案有两个项目:DLL和一个测试程序应用程序——本质上是一个带有按钮的窗体,可以调用DLL中的函数。一切正常-我可以创建缺陷,更新并删除它们。当我关闭主窗体时,应用程序会很好地停止。

    但是当我调用一个返回所有可用项目列表的函数时(为了填充一个组合框),如果我关闭主窗体,vstudio仍然将解决方案显示为正在运行,我必须停止它。

    我已经设法在我的代码中确定了一个函数,当我调用时,解决方案仍然是“挂起”的,如果不挂起,它会很好地关闭。这是对TDC对象中某个属性的调用 get_VisibleProjects 返回一个 List (不是.NET类型,而是COM库中的一个类型)-我只是迭代它并返回一个适当的列表(稍后我将使用它来填充组合框):

        public List<string> GetAvailableProjects()
        {
            List<string> projects = new List<string>();
            foreach (string project in this.tdc.get_VisibleProjects(qcDomain))
            {
                projects.Add(project);
            }
            return projects;
        }
    

    我的假设是有些东西会被保留在记忆中。如果我在vstudio之外运行exe,它将关闭——但谁知道内存中会留下什么?

    我的问题是-我如何摆脱调用这个属性返回的任何东西?GC不应该处理这个吗?我需要深入研究指针吗?

    我尝试过的事情:

    1. 将列表获取到变量中,并在函数末尾将其设置为空
    2. 向类中添加析构函数并使 tdc 对象
    3. 一步一步地浏览测试仪函数应用程序,当窗体关闭,主函数结束时——它关闭了,但是vstudio仍然显示我正在运行。

    谢谢你的帮助!

    4 回复  |  直到 14 年前
        1
  •  0
  •   GExGE    14 年前

    尝试将这两行添加到生成后事件:

    call "$(DevEnvDir)..\Tools\vsvars32.bat"
    editbin.exe /NXCOMPAT:NO "$(TargetPath)"
    
        2
  •  0
  •   Alex Shnayder    14 年前

    完成后,是否尝试使用System.Runtime.InteropServices.Marshal.ReleaseComObject手动释放列表对象?

        3
  •  0
  •   leppie    14 年前

    我怀疑一些悬空的线。

    当发生这种情况时,暂停调试器中的进程,看看还有哪些线程。

        4
  •  0
  •   Alex Shnayder    14 年前

    可以尝试使用它的count和item属性手动迭代列表,而不是使用它的迭代器,例如:

    for (int i=1; i <= lst.Count ; ++i)
    {
     string projectName = lst.Item(i);
    }
    

    如果不使用迭代器,它可能是使它保持活动的迭代器,而不是列表对象本身。