none
execl进程调用后如何及时关闭,而不是在程序退出后关闭。 RRS feed

  • 问题

  • 在导出电子表格时,使用

        oExcel.Quit()
        osheet1 = Nothing
        oBook = Nothing
        oExcel = Nothing
        GC.Collect()

    发现始终会留一个进程没有被杀死,不论导出的次数多少次,始终会留下一个进程,比较奇怪,不知道如何在完成到处之后就及时注销这个线程。

    • 已更改类型 Martin_XieModerator 2011年11月14日 5:21 Change to question so that more beginners can search out it.
    2011年11月7日 3:23

答案

  • Hi fengqiwuyong,

     

    Welcome to MSDN Forum.

     

    使用 Visual Studio .NET 客户端执行自动化功能后不退出 Office 应用程

    http://support.microsoft.com/kb/317109/zh-cn

     

    Microsoft Visual Basic .NET Microsoft Visual C# .NET 应用程序中调用Microsoft Office组建执行自动化功能后,当调用 Quit 方法时,没有退出 Office 应用程序。

     

    原因

    Visual Studio .NET 从托管代码调用 COM 对象时,它自动创建运行库可调用包装 (RCW)RCW 封送 .NET 应用程序和 COM 对象之间的调用,RCW 保留着对 COM 对象的引用计数。因此,如果 RCW 上没有将所有引用全部释放,COM 对象就不会退出。

    要确保退出 Office 应用程序,自动化代码一定要满足以下条件:

    ·         将每个对象声明为新变量。例如,将下面的代码行

    ·         oBook = oExcel.Workbooks.Add()
                                                                                            

    更改为以下内容:

    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
                                                                                            

    ·         停止使用某个对象时,应使用System.Runtime.InteropServices.Marshal.ReleaseComObject,这样可以减少 RCW 的引用计数。

    ·         要释放对变量的引用,请将变量设置为等于 Nothing  Null

    ·         使用 Office 应用程序对象的 Quit 方法通知服务器关闭。


    Martin Xie [MSFT]
    MSDN Community Support | Feedback to us
    2011年11月14日 5:20
    版主

全部回复

  • Hi fengqiwuyong,

     

    Welcome to MSDN Forum.

     

    使用 Visual Studio .NET 客户端执行自动化功能后不退出 Office 应用程

    http://support.microsoft.com/kb/317109/zh-cn

     

    Microsoft Visual Basic .NET Microsoft Visual C# .NET 应用程序中调用Microsoft Office组建执行自动化功能后,当调用 Quit 方法时,没有退出 Office 应用程序。

     

    原因

    Visual Studio .NET 从托管代码调用 COM 对象时,它自动创建运行库可调用包装 (RCW)RCW 封送 .NET 应用程序和 COM 对象之间的调用,RCW 保留着对 COM 对象的引用计数。因此,如果 RCW 上没有将所有引用全部释放,COM 对象就不会退出。

    要确保退出 Office 应用程序,自动化代码一定要满足以下条件:

    ·         将每个对象声明为新变量。例如,将下面的代码行

    ·         oBook = oExcel.Workbooks.Add()
                                                                                            

    更改为以下内容:

    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
                                                                                            

    ·         停止使用某个对象时,应使用System.Runtime.InteropServices.Marshal.ReleaseComObject,这样可以减少 RCW 的引用计数。

    ·         要释放对变量的引用,请将变量设置为等于 Nothing  Null

    ·         使用 Office 应用程序对象的 Quit 方法通知服务器关闭。


    Martin Xie [MSFT]
    MSDN Community Support | Feedback to us
    2011年11月14日 5:20
    版主
  • 原来是这样,^_^
    2011年11月17日 13:04
  • 還是不行啊~   求救!
    2011年12月29日 6:58
  • Welcome to MSDN Forum, Carol.

    That's likely to get quicker and better responses if you open a new thread and describe your question in detail. You can reference this thread in your question description so that others can understand better it.


    Martin Xie [MSFT]
    MSDN Community Support | Feedback to us
    2011年12月29日 7:18
    版主