退出后,申请程序将保持加载状态

| 我们有一个允许通过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)均保持加载状态: 首先关闭应用程序,然后关闭实用程序表单 首先关闭实用程序表单,然后关闭应用程序 \“ Application.exe \”唯一消失的时间是:先关闭应用程序,然后在任务管理器中单击\“结束任务\”,关闭实用程序窗体。 任何帮助将不胜感激。     
已邀请:
        我知道您说它是出于某种原因而拆分的,但这应该是:
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不是if3ѭ,这可以保证释放它,并且如果它抛出异常(请注意异常列表),则可以捕获它并弄清楚发生了什么。无论是否引发异常,objX都将设置为“ 3”,并且将调用GC。 可能不是此代码导致您的程序保持打开状态。您将需要显示更多代码(它们如何交互,或者您可能手动启动的任何非守护程序线程也应归咎于此)。听起来好像Utility正在强制应用程序通过非守护进程后台线程保持活动状态,但实际上可能是相反的情况,并且可能是双向执行。     

要回复问题请先登录注册