2012-03-31 8 views
1

Nachdem ich viele Threads hier über keine Doppelpunkte beim Referenzieren von Excel-Objekten gelesen habe, entschied ich mich, es zu implementieren.Beenden Excel-Prozess

Es funktionierte, bis ich in meiner Schleife zu tun begann.

Hier ist meine Schleife. Beachten Sie, dass es funktioniert, wenn ich dies auskommentiere:

 for (int i = 1; i < dgv.Columns.Count + 1; i++) 
     { 
      excelWorkbook.Cells[1, i] = dgv.Columns[i - 1].HeaderText; 

      var cell = excelWorkbook.Cells[1, i]; 
      var fontSetter = cell.Font; 
      fontSetter.Bold = true; //Bolds the header row 

      // Garbage collecting 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 

      Marshal.FinalReleaseComObject(fontSetter); 
      Marshal.FinalReleaseComObject(cell); 
     } 

Sollte nicht mein Code sie Variablen richtig entsorgen?

Hier ist meine vollständige Code:

[Code removed] 

Ich versuche, die Schritte zu folgen, über auf How do I properly clean up Excel interop objects? (die zweite Antwort)

Antwort

1

Es ist nicht leicht, dieses Recht zu bekommen. Aber ich bin überrascht folgendes selbst kompiliert:

excelWorkbook.Cells[1, i] = dgv.Columns[i - 1].HeaderText; 
var cell = excelWorkbook.Cells[1, i]; 

Meinten Sie:

excelWorkbook.Cells[1, i].Value = dgv.Columns[i - 1].HeaderText; 
var cell = excelWorkbook.Cells[1, i]; 

, die ersetzt werden sollen:

var cell = excelWorkbook.Cells[1, i]; 
cell.Value = dgv.Columns[i - 1].HeaderText; 

Ich weiß nicht, worauf es ankommt in Ihrem GC.Collect und GC.WaitForPendingFinalizers Anrufe, seit Sie sie vor cell und fontSetter gehen außerhalb des Geltungsbereichs.

Schließlich sollten die Aufrufe an Marshal.FinalReleaseComObject wahrscheinlich in einem finally-Block sein, so dass sie ausgeführt werden, auch wenn eine Ausnahme ausgelöst wird.

+0

Ich versuchte es, indem ich die volle Schleife in einen Versuch putting und dann schließlich verwendete, aber es war nicht in der Lage, die Variablen zu finden. Vielleicht, weil sie in der Schleife erklärt werden? – TheGateKeeper

+0

Ja, der Versuch/endlich müsste innerhalb der Schleife sein. Jedes Mal, wenn Sie sich das Aussehen ansehen, verweisen Sie auf eine neue Zelle und ihre Schriftart, und Sie müssen alle freigeben. – Joe

+0

Ich habe es einfacher gemacht, wie unten gezeigt – TheGateKeeper

0

Ich tat es, indem ich die Methode befolgte, die von Nightcoder in How do I properly clean up Excel interop objects? spezifiziert wurde.

Sie müssen nichts referenzieren und haben den geringsten Durcheinander von allen, es schließt den Prozess durch seine ID. Hoffe, das hilft jemandem, der hereinkommt.