Проект Visual Studio остается «застрял» при остановке - PullRequest
1 голос
/ 04 мая 2010

В настоящее время разрабатывается библиотека 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 не должен справиться с этим? Нужно ли копаться в указателях?

То, что я пробовал:

  1. получение списка в переменную и установка его в null в конце функции
  2. Добавление деструктора в класс и обнуление объекта tdc
  3. Пройти через приложение-функцию тестера до конца, когда форма закрывается и функция Main заканчивается - она ​​закрывается, но VStudio по-прежнему показывает, что я работаю.

Спасибо за вашу помощь!

Ответы [ 4 ]

0 голосов
/ 11 августа 2010

Попробуйте добавить эти 2 строки в событие после сборки:

call "$(DevEnvDir)..\Tools\vsvars32.bat"
editbin.exe /NXCOMPAT:NO "$(TargetPath)"
0 голосов
/ 09 мая 2010

Я подозреваю, что некоторые висячие темы.

Когда это происходит, приостановите процесс в отладчике и посмотрите, какие потоки все еще существуют.

0 голосов
/ 13 мая 2010

Может быть попытаться повторить список вручную, используя его свойства count и Item вместо использования его итератора, например:

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

Это может быть итератор, который поддерживает его, а не сам объект списка, если не использовать итератор, может не возникнуть проблем.

0 голосов
/ 09 мая 2010

Вы пытались вручную освободить объект List с помощью System.Runtime.InteropServices.Marshal.ReleaseComObject, когда вы закончили с ним?

...