相关疑难解决方法(0)

如何正确清理Excel互操作对象?

我在C#(ApplicationClass)中使用Excel互操作,并在我的finally子句中放置了以下代码:

while (System.Runtime.InteropServices.Marshal.ReleaseComObject(excelSheet) != 0) { }
excelSheet = null;
GC.Collect();
GC.WaitForPendingFinalizers();
Run Code Online (Sandbox Code Playgroud)

虽然这种工作,Excel.exe即使我关闭Excel后,该过程仍然在后台.只有在我的应用程序手动关闭后才会发布.

我做错了什么,或者是否有其他方法可以确保互操作对象得到妥善处理?

c# excel interop com-interop

733
推荐指数
20
解决办法
30万
查看次数

c#和excel自动化 - 结束正在运行的实例

我正在通过C#尝试Excel自动化.我已经按照微软的所有指示来解决这个问题,但是我仍然在努力放弃Excel的最终引用,以便关闭它并使GC能够收集它.

代码示例如下.当我注释掉包含类似于以下行的代码块时:

Sheet.Cells[iRowCount, 1] = data["fullname"].ToString();
Run Code Online (Sandbox Code Playgroud)

然后文件保存并退出Excel.否则文件将保存,但Excel将作为进程运行.下次运行此代码时,它会创建一个新实例,并最终构建它们.

任何帮助表示赞赏.谢谢.

这是我的代码的准系统:

        Excel.Application xl = null;
        Excel._Workbook wBook = null;
        Excel._Worksheet wSheet = null;
        Excel.Range range = null;

        object m_objOpt = System.Reflection.Missing.Value;

        try
        {
            // open the template
            xl = new Excel.Application();
            wBook = (Excel._Workbook)xl.Workbooks.Open(excelTemplatePath + _report.ExcelTemplate, false, false, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
            wSheet = (Excel._Worksheet)wBook.ActiveSheet;

            int iRowCount = 2;

            // enumerate and drop the values straight into the Excel file
            while (data.Read())
            {

                wSheet.Cells[iRowCount, …
Run Code Online (Sandbox Code Playgroud)

c# excel automation

13
推荐指数
3
解决办法
2万
查看次数

我什么时候需要调用ReleaseComObject?

在Microsoft Office AddIn中,我们在事件中传递COM对象.举一个特定的情况,当Word打开一个文档时,我们被调用并传递一个Document对象.那么我们什么时候需要调用Marshal.ReleaseComObject()?

  1. 如果我们访问Document对象,我们需要调用它吗?或者我们可以假设Word已经访问过它并将其清理干净吗?
  2. 如果我们访问Document.Name,它给我们一个字符串.由于字符串不是COM对象,我们不需要清理它 - 正确吗?
  3. 但是如果我们访问任何返回包装COM对象的类的成员(这是由成员方法/函数返回的任何类),我们确实需要调用release - 对吗?

如果我们错过了发布会怎么样?我们持有的任何COM对象在不确定的时间内包含在我们的类中,并且实现了IDisposable.我们完成后调用Dispose().但是处理这个问题的一些代码很复杂,我猜我们偶尔会遇到一个不调用Dispose的情况.

我们最好有一个终结器,然后为这些对象的每个实例增加开销(很多!)?或者我们最好使用少量从未发布的Word COM对象?

谢谢 - 戴夫

.net com office-interop

8
推荐指数
1
解决办法
1903
查看次数

标签 统计

c# ×2

excel ×2

.net ×1

automation ×1

com ×1

com-interop ×1

interop ×1

office-interop ×1