目前正在为HP质量中心开发连接器DLL。我正在使用他们的(插入exlative)COM API连接到服务器。 Interup包装器由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不应该处理这个吗?我需要深入研究指针吗?
我尝试过的事情:
tdc
对象感谢您的协助!
答案 0 :(得分:0)
完成后,您是否尝试使用System.Runtime.InteropServices.Marshal.ReleaseComObject手动释放List对象?
答案 1 :(得分:0)
我怀疑有些悬空线。
发生这种情况时,请在调试器中暂停该过程并查看仍然存在的线程。
答案 2 :(得分:0)
可以尝试使用它的count和Item属性手动迭代列表,而不是使用它的迭代器,有些事情如下:
for (int i=1; i <= lst.Count ; ++i)
{
string projectName = lst.Item(i);
}
它可能是Iterator使它保持活动而不是列表对象本身,如果不使用迭代器可能没有问题。
答案 3 :(得分:0)
尝试将这两行添加到构建后事件:
call "$(DevEnvDir)..\Tools\vsvars32.bat"
editbin.exe /NXCOMPAT:NO "$(TargetPath)"