相关疑难解决方法(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万
查看次数

释放临时COM对象

使用COM对象考虑以下C#代码.


MyComObject o = new MyComObject;
try
{
 var baz = o.Foo.Bar.Baz;
 try
 { 
  // do something with baz
 }
 finally
 {
  Marshal.ReleaseComObject(baz);
 }
}
finally
{
 Marshal.ReleaseComObject(o);
}

这将释放COM对象obaz,而不是临时对象returnd的o.Fooo.Foo.Bar.当这些对象拥有大量非托管内存或其他资源时,这可能会导致问题.

一个明显但丑陋的解决方案是,使用try-finally和更加混乱代码Marshal.ReleaseComObject.请参阅 C#+ COM Interop,确定性版本

作为一种解决方法,我创建了一个帮助类


class TemporaryComObjects: IDisposable
{
 public C T<C>(C comObject)
 {
  m_objects.Add(comObject);
  return comObject;
 }
 public void Dispose()
 {
  foreach (object o in m_objects)
   Marshal.ReleaseComObject(o);
 }
}

用法:


using (TemporaryComObjects t = new TemporaryComObjects())
{ …
Run Code Online (Sandbox Code Playgroud)

.net c# com interop com-interop

13
推荐指数
1
解决办法
2028
查看次数

将Excel文件作为服务器进程读取

我正在尝试找到一种在NT服务器操作系统上读取Excel文件内容的适当方法.我在使用Excel API时遇到了很多问题,然后遇到了Office自动化的官方微软,它指出Excel API不适合Excel自动化.我看到的排序问题类似于本文中描述的问题.

还有另一种方法可以在服务器(没有用户界面)上读取Excel文件(xls,xlsx,xlsm),这种方式不会遭受Excel API中强加的相同类型的线程/安全/许可证问题吗?

c# excel windows-services

11
推荐指数
1
解决办法
8087
查看次数

标签 统计

c# ×3

com-interop ×2

excel ×2

interop ×2

.net ×1

com ×1

windows-services ×1