В настоящее время разрабатывается библиотека DLL для подключения к Центру качества HP. Я использую их (вставьте примерный) COM API для подключения к серверу. Оболочка Interop создается автоматически VStudio.
Мое решение имеет 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;
}
Я предполагаю, что что-то сохраняется в памяти. Если я запускаю EXE вне VStudio, он закрывается - но кто знает, что осталось в памяти?
Мой вопрос - как мне избавиться от того, что вызывает это свойство? Разве GC не должен справиться с этим? Нужно ли копаться в указателях?
То, что я пробовал:
- получение списка в переменную и установка его в null в конце функции
- Добавление деструктора в класс и обнуление объекта
tdc
- Пройти через приложение-функцию тестера до конца, когда форма закрывается и функция Main заканчивается - она закрывается, но VStudio по-прежнему показывает, что я работаю.
Спасибо за вашу помощь!