Процесс приложения остается загруженным после выхода - PullRequest
0 голосов
/ 27 мая 2011

У нас есть приложение, которое позволяет настраивать пользовательский интерфейс и взаимодействие через SDK.Для этой цели разработана библиотека DLL с использованием VB.Net и SDK.Переменная объекта относится к приложению, и есть некоторые другие переменные объекта для компонентов в приложении.

Приложение позволяет назначать код VBScript кнопкам, отображаемым на панели инструментов.Код VBScript:

Dim Utility_Main
Set Utility_Main = CreateObject("Utility.Application")
Utility_Main.Launch()

Это запускает форму (пользовательский интерфейс), и пользователи могут взаимодействовать с приложением через эту форму.Хотя само приложение имеет собственный пользовательский интерфейс, эта служебная форма создана для поиска в базе данных, сохранения определенных атрибутов объектов приложения и т. Д.

Практически в каждой точке выхода формы вызывается процедура для сброса переменных объекта дляприложение и его компоненты, используя следующий код:

=======================================

    Try
        Marshal.ReleaseComObject(objX)
    Catch
    End Try

    Try
        objX = Nothing
        GC.Collect()
    Catch
    End Try

Примечание 1: ReleaseComObject и установка для переменной объекта значения Nothing были включены в «If (Not objX - Nothing) Then».Но он был изменен на приведенный выше формат, чтобы обеспечить его вызов.

Примечание2: GC.Collect был добавлен позже для принудительного вызова GC.

========================================

Это делается для каждого объекта в обратном порядке иерархии объектов.

Исполняемый файл приложения (Application.exe) остается загруженным в обоих следующих случаях:

  1. Сначала закрывается приложение, а затем закрывается форма служебной программы
  2. Сначала закрывается форма служебной программы изатем приложение закрывается

Единственный раз, когда «Application.exe» исчезает, это если сначала закрывается приложение, а затем закрывается форма служебной программы, нажав «Завершить задачу» в диспетчере задач.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 27 мая 2011

Я понимаю, что вы говорите, что он по какой-то причине был разделен, но это должно быть:

Try    
    If objX IsNot Nothing Then    
        Marshal.ReleaseComObject(objX)    
    End If    
Catch e As ArgumentException
    ' hopefully you have some debug output here    
Finally    
    objX = Nothing
    GC.Collect() ' really doubt this is necessary
End Try

Это гарантирует, что objX будет выпущен, если он не Nothing, и если это выдает исключение (обратите внимание на список исключений), затем вы можете его поймать и выяснить, что произошло.Независимо от того, выдано ли исключение, для objX будет установлено значение Nothing и будет вызван GC.

Вероятно, не этот код заставляет вашу программу оставаться открытой.Вам нужно будет показать больше кода (в этом также виноваты все нити-демоны, которые вы можете запустить вручную).Похоже, что Utility заставляет Приложение остаться в живых с не-демоном, фоновым потоком, но это действительно может быть наоборот, и это может быть в том случае, если это происходит в обоих направлениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...