COM.-Server wird nicht beendet

28/02/2008 - 22:34 von Paul Werkowitz | Report spam
Hallo Netizens,

Automation Aufgaben der Office-Komponenten sind ja unter .NET nicht schwer.
Dachte ich zumindest, bis ich feststellte, dass sich meine einmal
instanziierten Server nicht mehr beenden wollen...

Folgenden Code habe ich:

using Microsoft.Office.Core;
using Excel = Microsoft.Office.Interop.Excel;

...


Excel.Application exlApp = new Excel.Application();
Excel.Workbook wb = exlApp.Workbooks.Open( s, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing);

Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets[1];
Excel.Range range = ws.get_Range( "A1", "C7" );

object[,] saRet = (object[,])range.get_Value( Type.Missing );

long rowCount = saRet.GetUpperBound(0);
long colCount = saRet.GetUpperBound(1);

for (long row = 1; row <= rowCount; row++)
for (long col = 1; col <= colCount; col++)
{
object obj = saRet[ row, col ];
if ( obj != null )
Debug.WriteLine( obj.ToString() );
}

Marshal.ReleaseComObject(range);
Marshal.ReleaseComObject(ws);
wb.Close(false, Type.Missing, Type.Missing);
Marshal.ReleaseComObject(wb);
exlApp.Quit();
Marshal.ReleaseComObject(exlApp);


Nach jedem Durchlauf der Funktion bleibt ein Prozess EXCEL.EXE bestehen,
was natürlich bei mehrfachem Aufruf über den Tag hinweg schnell zu
Problemen führt.

Nun gibt es hier zwei Fragen:

1. Warum ist das so, und was tut man dagegen? Die (vielen) Beispiele im
Netz gehen auf diese Problematik nicht ein.

2. Ich hatte eigentlich gehofft, dass ich mich bei .NET mit
Resourcenmanagement nicht mehr so beschàftigen muss. Allein die Existenz
von Marshal.Release bedeutet aber was anderes. Warum muss *ich* das
aufrufen, anstelle das diese Aufrufe in den Dispose-Routinen untergebracht
sind? Oder muss ich das evtl. gar nicht aufrufen, und das Beispiel ist ganz
falsch?


Kopfschüttel...
Paule
 

Lesen sie die antworten

#1 Frank Dzaebel
28/02/2008 - 22:51 | Warnen spam
Hallo Paul,

... dass sich meine einmal instanziierten [COM] Server nicht
mehr beenden wollen... [...]
using Excel = Microsoft.Office.Interop.Excel;



Ich empfehle da einfach mal unsere Gruppe:
http://groups.google.com/group/micr...Excel+Quit
weil das schon so oft beschrieben wurde.

Oder der Einfachheit halber rauskopiert:

[...] Aber hàufig ist es eben das Vergessen von:
Marshal.ReleaseComObject(objExcelObject),
GC.Collect() und
GC.WaitForPendingFinalizers()

[Office application does not quit after automation from Visual Studio .NET
client]
http://support.microsoft.com/defaul...US;q317109


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen