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

了解.NET中的垃圾收集

考虑以下代码:

public class Class1
{
    public static int c;
    ~Class1()
    {
        c++;
    }
}

public class Class2
{
    public static void Main()
    {
        {
            var c1=new Class1();
            //c1=null; // If this line is not commented out, at the Console.WriteLine call, it prints 1.
        }
        GC.Collect();
        GC.WaitForPendingFinalizers();
        Console.WriteLine(Class1.c); // prints 0
        Console.Read();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,即使main方法中的变量c1超出范围并且在GC.Collect()调用时没有被任何其他对象进一步引用,为什么它没有在那里完成?

.net c# garbage-collection

161
推荐指数
2
解决办法
5万
查看次数

使用GC.Collect()有什么不对?

虽然我确实理解玩这个功能的严重影响(或者至少是我的想法),但我不明白为什么它会成为那些受人尊敬的程序员不会使用的东西之一,即使是那些甚至不知道的人也是如此它是什么.

假设我正在开发一个应用程序,其中内存使用量根据用户的行为而变化很大.应用程序生命周期可分为两个主要阶段:编辑和实时处理.在编辑阶段,假设创建了数十亿甚至数万亿的对象; 其中一些是小的,一些不是,有些可能有终结器,有些可能没有,并且假设它们的寿命从几毫秒到长时间不等.接下来,用户决定切换到实时阶段.在这一点上,假设性能起着根本性的作用,程序流程中的最轻微改动可能会带来灾难性的后果.然后,通过使用对象池等将对象创建减少到最小可能,然后,GC意外地进行编辑并将其全部抛弃,并且有人死亡.

问题:在这种情况下,在进入第二阶段之前调用GC.Collect()不是明智的吗?

毕竟,这两个阶段永远不会在时间上相互重叠,GC可能收集的所有优化和统计数据在这里几乎没用......

注意:正如你们中的一些人所指出的那样,.NET可能不是这样的应用程序的最佳平台,但这超出了这个问题的范围.目的是澄清GC.Collect()调用是否可以改善应用程序的整体行为/性能.我们都同意你在这种情况下做这种事情的情况非常罕见,但话说再次,GC试图猜测并且在大多数情况下做得非常好,但它仍然是猜测.

谢谢.

.net performance garbage-collection memory-management

102
推荐指数
14
解决办法
6万
查看次数

数据访问后在C#中关闭Excel应用程序进程

我正在用C#编写一个应用程序,它打开一个用于读/写操作的Excel模板文件.我想当用户关闭应用程序时,excel应用程序进程已关闭,而不保存excel文件.多次运行应用程序后,请参阅我的任务管理器.

在此输入图像描述

我使用此代码打开excel文件:

public Excel.Application excelApp = new Excel.Application();
public Excel.Workbook excelBook;
excelBook = excelApp.Workbooks.Add(@"C:/pape.xltx");
Run Code Online (Sandbox Code Playgroud)

对于数据访问,我使用以下代码:

Excel.Worksheet excelSheet = (Worksheet)(excelBook.Worksheets[1]);
excelSheet.DisplayRightToLeft = true;
Range rng;
rng = excelSheet.get_Range("C2");
rng.Value2 = txtName.Text;
Run Code Online (Sandbox Code Playgroud)

我在stackoverflow中看到类似的问题,例如这个问题这个,以及测试答案,但它不起作用.

c# excel excel-interop kill-process visual-studio-2012

78
推荐指数
5
解决办法
14万
查看次数

释放临时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
查看次数

如何调试慢速Office应用程序互操作构造函数?

我有一个处理excel的应用程序.最近我遇到了Excel对象创建速度非常慢的问题.

我用这个简单的代码重新创建了这个问题:

Microsoft.Office.Interop.Excel.Application xlApp;
xlApp = new Microsoft.Office.Interop.Excel.Application(); 
Run Code Online (Sandbox Code Playgroud)

第二行导致延迟.

为了测量新对象分配所需的时间,上面的代码已经扩展了时间跟踪解决方案,结果是确凿的.在NORMAL情况下,上面的代码在0.5秒内执行,而在FAULTY-BEHAVIOR的情况下,它可能需要长达5分钟.

没有内存泄漏,并且正确释放了excel对象.我的解决方案全年24/7运行,没有任何问题.我不确定它是否重要但是应用程序在20个单独的用户会话(服务器机器)上运行.因此,此应用程序有20个副本同时运行,可能会导致同时运行20个Excel副本.

这个问题第一次在2个月前被注意到,并且已通过升级办公室(2010年 - > 2013年)得到解决.这次我有更多时间进行调查,遗憾的是结果并不乐观.

事实:

  • 目前只有一台机器受此问题影响(24个CPU内核,24GB Ram)
  • 当"延迟"发生时,CPU根本没有压力
  • 我尝试使用"进程监视器"应用程序来验证当我们"新的Excel.Application()"构造函数(看看是否有任何过多的磁盘/内存/ CPU使用)时会发生什么 - 没有资源限制的迹象.没有与COM对象等相关的日志文件的迹象.
  • 这里唯一的问题是这几分钟的延迟.所有其他Excel Interop命令都照常工作.

主要问题:

  • 有没有办法调试这个Microsoft.Office.Interop.Excel.Application()构造函数,看看哪个部分是一个问题?

外部内容

编辑 - 附加测试

PowerPoint构造函数不受延迟的影响

ppApp = new Microsoft.Office.Interop.PowerPoint.Application();
Run Code Online (Sandbox Code Playgroud)

c# office-interop excel-interop

10
推荐指数
1
解决办法
2253
查看次数

如何结束excel.exe进程?

我试图从vb.net 3.5获得excel文件的excel表名,但它打开但excel.exe仍然在这个过程中.如何在不从任务管理器中删除excel.exe的情况下停止进程?

我意识到新的excel.application开始了新的过程.

我试图使用戒烟,关闭和处置.......................没有任何效果

以下是我的代码

   Dim sheetName As New Excel.XlSheetType
   Dim newExcell As New Excel.Application
   Dim newWorkBook As Excel.Workbook = app.Workbooks.Open(MyFileName)
   Dim worksheetName As String
   Dim ws As Excel.Worksheet = CType(WB.Worksheets.Item(1), Excel.Worksheet)
    worksheetName = ws.Name
Run Code Online (Sandbox Code Playgroud)

我不能使用kill因为有其他excel应用程序正在运行,所以如何从处理器关闭这个特定的excel.exe.请帮忙

.net vb.net excel .net-3.5

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