C# .Net アプリケーションから Excel を実行していますが、プロセスをシャットダウンするのに問題があります。C# プログラムから Excel プロセスを正しくシャットダウンするにはどうすればよいですか?
4 に答える
あなたの問題は、ぶら下がっている COM 参照が Excel プロセスのシャットダウンを妨げていることが原因であると私は約 99% 確信しています。Excel は、ハンドルを取得して明示的にシャットダウンする手段を提供せずに、COM 参照を透過的に生成する傾向があるため、特にこの傾向があります。
PIA は、基になる COM オブジェクトへの独自の参照セットを作成することで、この問題を悪化させます。明示的にクリーンアップを行わせない限り、PIA はクリーンアップしません。PIA を介して Excel を操作するのは、まさにこの理由から非常に面倒です。
Application.Quit()
(IIRC と呼ばれるもの)は、参照がすべて正しくクリーンアップされている場合、プロセスをシャットダウンします。これは、Excel プロセスへの COM 参照を保持するすべてのライフ サイクルを慎重に管理し、すべての COM 参照が適切にクリーンアップされていることを確認する必要があることを意味します。
これを試して:
foreach (System.Diagnostics.Process process in System.Diagnostics.Process.GetProcessesByName("EXCEL"))
{
if (process.MainModule.ModuleName.ToUpper().Equals("EXCEL.EXE"))
{
process.Kill();
break;
}
}
Application app = new Application();
...
EndTask((IntPtr)app.Hwnd, true, true);
[DllImport("user32.dll")]
public static extern bool EndTask(IntPtr hwnd, bool shutdown, bool force);
必要に応じて、 COM相互運用機能のないExcel互換コンポーネントを提供するSpreadsheetGear for .NETの使用を検討することもできます(インスタンスがハングしない、パフォーマンスが向上する、ExcelがインストールされているかExcelのバージョンがインストールされているかを心配する必要はありません) 。
ここでC#およびVBソースを使用したライブASP.NETサンプルを確認できます。また、SpreadsheetGearのWindowsフォームコントロールとサンプルの詳細についてはこちらをご覧ください。自分で試してみたい場合は、こちらから無料試用版をダウンロードしてください。
免責事項:私はSpreadsheetGearLLCを所有しています