C#でCOM Excel Applicationクラスを使用しています。私はWorkbookBeforeClose
を扱った。しかし、今私はCOMオブジェクトを適切に解放することはできません。.NETでイベントを処理するときにすべてのCOMオブジェクトを解放する方法
このイベントを処理する前にCOMオブジェクトを適切にリリースすることができましたが、そのコードの部分にコメントするときは、アプリケーションが正常に動作することに注意してください。
メモリから解放されたCOMオブジェクトとその解放方法を教えてください。
編集:
public void Init()
{
...
application = new Excel.Application();
application.WorkbookBeforeClose += new Excel.AppEvents_WorkbookBeforeCloseEventHandler(application_WorkbookBeforeClose);
}
...
void application_WorkbookBeforeClose(Excel.Workbook Wb, ref bool Cancel)
{
if (WorkbookBeforeClose != null)
{
ExcelCloseEventArgs args = new ExcelCloseEventArgs();
WorkbookBeforeClose(this, args);
Cancel = args.Cancel;
}
else
Cancel = false;
}
...
private void closeExcel()
{
try
{
if (workbook != null)
{
workbook.Close(false);
}
}
catch (Exception e) { }
finally
{
if (workbooks != null)
Marshal.ReleaseComObject(workbooks);
if (workbook != null)
Marshal.ReleaseComObject(workbook);
}
try
{
if (application != null)
{
application.WorkbookBeforeClose -= handler;
application.Quit();
Marshal.ReleaseComObject(application);
Marshal.ReleaseComObject(handler);
process.WaitForExit();
}
}
catch (Exception e) { throw; }
finally
{
}
workbook = null;
workbooks = null;
application = null;
if (process != null && !process.HasExited)
process.Kill();
if (threadCulture != null)
Thread.CurrentThread.CurrentCulture = threadCulture;
initialized = false;
}
アプリケーションが行process.WaitForExit()
で一時停止:私はやった 。
あなたが行ったことを私たちに見せてもらえますか?何が間違っているのを見ることができますか? –