退出后应用程序进程保持加载状

时间:2011-05-27 17:25:12

标签: vb.net garbage-collection class-library

我们有一个允许通过SDK自定义UI和交互的应用程序。 使用VB.Net和SDK为此目的开发DLL。 对象变量引用应用程序,并且应用程序中的组件还有一些其他对象变量。

应用程序允许将VBScript代码分配给工具栏中显示的按钮。 VBScript代码是:

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

这将启动一个表单(自定义UI),用户可以通过此表单与应用程序进行交互。 尽管应用程序本身具有自己的UI,但是此实用程序表单是为数据库查找而创建的,保留了应用程序对象的某些属性等。

在表单的几乎每个出口点,都会调用一个过程来使用以下代码为应用程序及其组件取消设置对象变量:

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

    Try
        Marshal.ReleaseComObject(objX)
    Catch
    End Try

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

注1:ReleaseComObject和设置对象变量为Nothing包含在“If(Not objX is Nothing)Then”中。但它被改为上面的格式以确保它被调用。

注意2:后来添加了GC.Collect以强制GC。

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

按对象层次结构的相反顺序对每个对象执行此操作。

应用程序的可执行文件(Application.exe)在以下两种情况下仍然加载:

  1. 首先关闭应用程序,然后关闭实用程序表单
  2. 首先关闭实用程序表单,然后关闭应用程序
  3. “Application.exe”消失的唯一时间是首先关闭应用程序,然后单击任务管理器中的“结束任务”关闭实用程序表单。

    非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我意识到你说它因某种原因被分开了,但这应该是:

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而被释放,如果那个throws an exception(注意例外列表),那么你可以抓住它并弄清楚发生了什么。无论是否抛出异常,objX都将设置为Nothing并且将调用GC。

这个代码可能不会导致程序保持打开状态。您将需要显示更多代码(它们如何交互,或者您可能手动启动的任何非守护程序线程也将受到责备)。听起来好像Utility正在强迫Application使用非守护进程,后台线程保持活着,但它实际上可能是另一种方式,并且可能是两个方向都这样做。