1

目前正在开发连接到 HP 质量中心的连接器 DLL。我正在使用他们的(插入说明性的)COM API 连接到服务器。VStudio 会自动创建一个 Interop 包装器。

我的解决方案有 2 个项目: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. 将列表放入变量并在函数末尾将其设置为 null
  2. 向类添加析构函数并使tdc对象为空
  3. 一路单步执行测试功能应用程序,当表单关闭并且 Main 功能结束时 - 它关闭了,但 VStudio 仍然显示我正在运行。

感谢你的协助!

4

4 回答 4

0

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

于 2010-05-09T09:01:43.720 回答
0

我怀疑有一些悬垂的线程。

发生这种情况时,请暂停调试器中的进程并查看仍然存在哪些线程。

于 2010-05-09T09:14:38.150 回答
0

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

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

如果不使用迭代器可能没有问题,它可能是让它保持活动状态的迭代器而不是列表对象本身。

于 2010-05-13T06:39:56.303 回答
0

尝试将这两行添加到构建后事件:

call "$(DevEnvDir)..\Tools\vsvars32.bat"
editbin.exe /NXCOMPAT:NO "$(TargetPath)"
于 2010-08-11T13:02:53.377 回答