Excel Prozess beendet nicht

tass

Mitglied
Hallo Freunde,

ich will mit meinem Programm Exceldateien bearbeiten, mein Problem ist, dass nach dem Zugriff das Excel Objekt nicht mehr freigegeben wird, es bleibt als Prozess im Taskmanager bestehen und beendet sich erst, wenn ich mein Programm beende.

Heir mein Code

Code:
Excel.Application ExcelObj = new Excel.Application();

ExcelObj.Visible = false;

object n		= System.Reflection.Missing.Value;
string filename = System.IO.Directory.GetCurrentDirectory() + @"\test.xls";
				
Excel.Workbook theWorkbook = ExcelObj.Workbooks.Open(
@filename,n,n,n,n,n,n,n,n,n,n,n,n,n,n );

ExcelObj.Workbooks.Close();
ExcelObj.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelObj);

Ich benutze Win2k mit OfficeXP(2002).

Es gibt hier im Forum schon ähnliche Fragen, aber die Lösungsvorschläge funktionieren bei mir nicht.

Fals jemand einen Tip hat wärs echt toll

mfg Tass
 
ich meine eigentlich reicht

System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelObj);

hm...

vielleicht nochmal

ExcelObj = null;
oder ExcelObj.Dispose();

oder so
 
Hallo!

Das Problem habe ich auch.
Ich hab mir aber abgeholfen indem ich mir die gesammten Excel-Instanzen geholt habe und sie anschließend beendet habe.
Code:
Process[] pro = Process.GetProcessesByName("EXCEL");

if ( pro.Length > 0 ){

	if ( MessageBox.Show(
		"Sollen alle geöffneten Excel-Dokumente geschlossen werden?\n\n"+
		"\t\t\tAchtung!\n\nAlle geöffneten Excel-Dokumente werden OHNE Aufforderung zum Speichern geschlossen!",
		"Excel-Dokumente schließen?",
		MessageBoxButtons.OKCancel, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2 )
		== DialogResult.OK ){

		foreach ( Process p in pro ){
			p.Kill();
		}
	}
}
Ist zwar so ziemlich rabiat, aber selbst Process.Close() hinterlässt Excel-Instanzen im Arbeitsspeicher.

MfG, cosmo
 
Danke für die Hilfe,

es geht jetzt und zwar so:

Code:
Excel.Application ExcelObj = new Excel.Application();

ExcelObj.Visible = false;

object n		= System.Reflection.Missing.Value;
string filename = System.IO.Directory.GetCurrentDirectory() + @"\test.xls";
				
Excel.Workbook theWorkbook = ExcelObj.Workbooks.Open( @filename,n,n,n,n,n,n,n,n,n,n,n,n,n,n );

ExcelObj.Workbooks.Close();
ExcelObj.Quit();

System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelObj);
				
ExcelObj = null;

GC.Collect();

Ich zwinge den GarbabeCollector zum aufräumen, oder so?

mfg Tass
 
Krass!

Wo hast Du das nachgelesen? Das Tutorial brauch ich auch. :D
Lass aber die Finger vom GC. Das macht's von ganz alleine.

MfG cosmo
 
Zuletzt bearbeitet:
Der richtige Zeitpunkt, um Rico Mariani zu zitieren:

"If you think you need to force a collection something has gone very wrong. You have to ask yourself, what sort of collection do I think I need? Gen0, Gen1, Gen2? How do I know that the GC will decide to do the collection that I think I need? What did I do so that now I need that kind of collection?"

Demzufolge: Finger weg vom GC.Collect(). Das macht wirklich nur in SEHR SEHR wenigen Fällen Sinn. Und in diesem Fall sicherlich nicht.
 
das hat auch damit ja nichts zu tun. es geht ja auch darum, den prozess zu killen und nicht einfach ungebrauchten speicherplatz aufzuräumen.
obwohl es ja sein kann, dass excel da mist macht ;)
ich denke mal es war einfach

excel = null;

oder?
 
War ja auch nur 'ne Frage am Rande von tass.
Das nullen reicht nicht aus. Mann muss vorher das Interop-Objekt wieder freigeben.
Code:
System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelObj);
Weil ich das noch nicht wusste, hab ich mir mit Process.Kill() ausgeholfen.

MfG, cosmo
 
System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelObj);

ist klar, aber ich meinte, dass dann durch das nullen der prozess verschwindet.

und das war meine frage :-D
 
Wenn das Objekt nicht "released" ist bringt das nullen nichts.
Die Instanz bleibt trotzdem im Arbeitsspeicher.
Wenn Du nach dem "releasen" nullst verschwindet die Instanz.
 

Neue Beiträge

Zurück