IRONSOFTWAREHOME
IRONXLの使用

ExcelオブジェクトをC#で解放 | IronXLでExcelプロセスの滞留を停止

Curtis Chau
Curtis Chau
Updated: 2026年6月28日

Excelオブジェクトを解放するC#: IronXLを使用して持続するExcelプロセスを停止する: 画像1 - Excelオブジェクトを解放するC#: 2つの方法を比較

C#アプリケーションでMicrosoft Excelファイルを扱う場合、Excelプロセスが終了しないという厄介な問題に遭遇することがよくあります。 コードの実行が終了した後も、タスクマネージャーに複数のEXCEL.EXEインスタンスが蓄積され、長時間メモリを消費し続けていることに気づくかもしれません。 このガイドでは、従来のExcel相互運用でこのような問題が発生する理由を説明し、 IronXLがこれらのCOMオブジェクトに関する問題を完全に解消し、複雑なクリーンアップコードや本番環境におけるメモリリークを回避する方法を示します。

根本的な原因は、.NET FrameworkがCOM参照を介してMicrosoft Officeとどのように連携するかという点にある。 Microsoft.Office.Interop.Excelを使用してコードを書くと、すべてのExcelアプリケーションオブジェクト、ワークブック、ワークシートがCOMオブジェクトを作成し、これらは明示的なクリーンアップを必要とします。解放呼び出しを1つでも逃したり、app.Workbooks.Open()のようにダブルドットのパターンを使用すると、Excelプロセスの終了を妨げる孤立した参照が残ります。

最初のステップ:
arrow pointer

Excelを閉じた後も、タスクマネージャーにExcelのプロセスが残るのはなぜですか?

COMオブジェクトの参照カウントが正しくデクリメントされていないため、Excelアプリケーションが終了しません。 コードが Excel アプリケーション、ワークブック、またはワークシートにアクセスするたびに、ランタイムは基となる COM オブジェクトへの参照カウントを保持するランタイム呼び出し可能ラッパー (RCW) を作成します。 .NETのガベージコレクターは、すべての参照がMarshal.ReleaseComObjectを使用して明示的に解放されるまで、これらのインターオブジェクトを解放できません。

処理が長引く原因となる一般的な間違いには、以下のようなものがあります。

  • プロパティチェーンでapp.Workbooks.Open()のように2つのドットを使用すること(これにより隠れた一時オブジェクトが作成される)
  • foreachループを使用してCOMコレクションを反復処理すること(これにより解放されていない列挙子が生成される)
  • Excelアプリケーションオブジェクト上でQuit()を呼び出すことを忘れる
  • 例外をキャッチしてfinallyブロックでクリーンアップを行わない

Microsoft Officeの以前のバージョン(2000~2003)では、Office APIオブジェクトを解放しないと、Excelのメインウィンドウが永久にフリーズしてしまうという問題がありました。 後のバージョンでは多少改善されていますが、Excel プロセスは依然としてタスク マネージャーに蓄積され、メモリ リークや Excel スプレッドシート ファイルへのファイル ロックの問題を引き起こす可能性があります。

この問題は、サーバーサイドアプリケーションやスケジュール実行アプリケーションにおいて特に深刻化する。これらのアプリケーションでは、プロセスが時間とともに蓄積され、最終的にサーバーのメモリが不足してしまうからだ。 なぜこのようなことが起こるのかを理解することが、作業に適したツールを選択するための第一歩となる。

COM層では何が起こるのか?

Excel COM オブジェクトに対するすべてのプロパティアクセスは、新しい RCW を作成する可能性があります。 Range用とダブルドットアクセスによる暗黙のものという2つの別々のCOMオブジェクトが作成されます。 ガベージコレクターはいずれこれらをクリーンアップするかもしれないが、そのタイミングは保証できない。 高スループットのアプリケーションでは、バックログの増加速度が収集速度を上回る可能性があります。

Windowsは内部的にCOM参照をカウントします。 そのカウントがゼロになるまで、基になるプロセス(EXCEL.EXE)は生き続けます。GC.WaitForPendingFinalizers()を呼び出すことでコレクションサイクルを強制できますが、このアプローチにはパフォーマンスコストが伴い、運用コードの長期的な解決策ではありません。

二重ドットパターンが問題を引き起こすのはなぜか?

ダブルドットパターン(app.Workbooks.Open(path))はC#では慣用ですが、COMインターオブコンテキストでは参照のない中間オブジェクトを生成します。 Openの呼び出しに使用され、その後すぐにあなたのコードがそれに参照を持たないため孤立します。 ガベージコレクターにはこれらのオブジェクトを終了させるための決まったスケジュールがないため、EXCEL.EXEは開いたままになります。

Interop を使用する上で唯一安全な方法は、すべての中間オブジェクトを名前付き変数に格納し、作成順とは逆の順序でそれぞれを明示的に解放することです。

Excel相互運用オブジェクトを正しくリリースするにはどうすればよいですか?

従来の方法では、作成されたすべてのCOMオブジェクトを綿密に追跡する必要がある。 二重ドットは避け、すべての中間オブジェクトをローカル変数に格納し、逆の順序で解放する必要があります。 以下のコードは、Stack Overflowの回答やMicrosoftのドキュメントによく見られる、冗長なクリーンアップパターンを示しています。

using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

// Verbose Interop cleanup pattern
Excel.Application excelApp = new Excel.Application();
Excel.Workbooks workbooks = excelApp.Workbooks;
Excel.Workbook workbook = workbooks.Open("report.xlsx");
Excel.Sheets sheets = workbook.Sheets;
Excel.Worksheet worksheet = (Excel.Worksheet)sheets[1];

// Work with data
worksheet.Cells[1, 1] = "Updated Value";

// Cleanup -- release EVERY COM object in reverse order
workbook.Close(false);
excelApp.Quit();

Marshal.ReleaseComObject(worksheet);
Marshal.ReleaseComObject(sheets);
Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(workbooks);
Marshal.ReleaseComObject(excelApp);

GC.Collect();
GC.WaitForPendingFinalizers();

このコードは、適切なクリーンアップを保証するために各Excelオブジェクトを別々に保存します。最後にGC.WaitForPendingFinalizers()の呼び出しを行い、ガベージコレクションを強制します。 一部の開発者は、例外が発生した場合でもクリーンアップを保証するために、すべてをtry/finallyブロックでラップします。

標準的なクリーンアップがうまくいかない極端なケースでは、一部のチームはWindowsジョブオブジェクトを使用してプロセスを強制終了する手法に頼ることがあります。 これには、AssignProcessToJobObjectのP/Invoke宣言が関与します。 これは最終手段としては有効だが、根本的な設計上の問題を解決するのではなく、症状を緩和しているに過ぎない。

COMフリーのExcelライブラリをC#にインストールするにはどうすればいいですか?

IronXLは、Excelファイルの操作において根本的に異なるアプローチを採用しています。 IronXLは、Microsoft Office COMオブジェクトをラップするのではなく、独自のパーサーとレンダラーを使用してExcelファイル形式を直接読み書きします。 これは、COM参照がなく、Office相互運用性の依存関係がなく、残存プロセスもないことを意味します。 パソコンにMicrosoft Excelをインストールする必要すらありません。

Visual Studio のNuGetパッケージ マネージャー コンソールを使用してIronXL をインストールします。

PM > Install-Package IronXL.Excel

または.NET CLIを使用します:

dotnet add package IronXL.Excel

インストール後、using IronXL;ディレクティブをファイルに追加します。これでプロジェクトは、Office依存なしにExcelファイル操作への直接的でネイティブなアクセスを持つようになります。 IronXLは、.NET 8、 .NET 9、 .NET 10、 .NET Framework 4.6.2以降を対象としており、Windows、Linux、macOS、Docker、およびAzure上で動作します。

必要なNuGetパッケージは何ですか?

必要なNuGetパッケージはひとつだけです: IronXL.Excel。 Microsoft Office、Office Interopアセンブリ、またはCOM登録には一切依存していません。 これにより、展開が劇的に簡素化されます。アプリケーションを自己完結型の実行ファイルとして公開すれば、Officeがインストールされていないサーバーでも実行できます。

PDF生成も必要なプロジェクトの場合、 IronPDFはIronXLと連携し、Excelの自動化処理を経由せずにExcelデータを直接PDFにエクスポートできます。

COMオブジェクトを使用せずにExcelファイルを読み込むにはどうすればよいですか?

以下のコードは、 IronXLを使用して Excel ファイルを読み込む方法を示しています。 クリーンアップコードは不要であることに注意してください。

using IronXL;

// Load and read Excel files without COM objects
WorkBook workBook = WorkBook.Load("report.xlsx");
WorkSheet workSheet = workBook.DefaultWorkSheet;

// Access cell values directly
string cellValue = workSheet["A1"].StringValue;
decimal columnSum = workSheet["B2:B10"].Sum();

// なし cleanup required -- workBook is a standard .NET object
Console.WriteLine($"Cell A1: {cellValue}");
Console.WriteLine($"Sum B2:B10: {columnSum}");
C#

コンソール出力

Excelオブジェクトを解放するC#: IronXLを使用して持続するExcelプロセスを停止する: 画像3 - 入力Excelファイルを読み取るIronXLの出力

IronXLはExcelオブジェクトをネイティブな.NETタイプとして処理します。Marshal.ReleaseComObjectを呼び出したり、ガベージコレクションサイクルを強制する必要はありません。

IronXLワークブックでは決定性のある廃棄を行うためにusingブロックを使用することもできますが、これはプロセスリークを防ぐために必須ではありません。これは単に良い.NETリソース管理の実践の問題です。

複数のワークシートにアクセスするにはどうすればよいですか?

IronXLで複数のワークシートにアクセスするのは、 .NETコレクションを操作するのと同じくらい簡単です。

using IronXL;

WorkBook workBook = WorkBook.Load("multi-sheet-report.xlsx");

// Iterate all worksheets
foreach (WorkSheet sheet in workBook.WorkSheets)
{
    string sheetName = sheet.Name;
    int rowCount = sheet.RowCount;
    Console.WriteLine($"Sheet '{sheetName}' has {rowCount} rows");
}

// Access a specific sheet by name
WorkSheet salesSheet = workBook["Sales"];
decimal totalRevenue = salesSheet["C2:C100"].Sum();
Console.WriteLine($"Total Revenue: {totalRevenue:C}");

COM反復列挙子も、隠れた一時オブジェクトも、クリーンアップも不要です。 IronXLのAPIは、全体を通して標準的な.NETコレクションパターンに準拠しています。

Interopを使用せずに新しいExcelファイルを作成するにはどうすればよいですか?

Excelファイルの作成も、同様に単純な方法パターンで行えます。 以下のコードは、新しいワークブックを作成し、構造化データを追加し、基本的な書式設定を適用して保存する方法を示しています。

using IronXL;

// Create a new Excel spreadsheet in XLSX format
WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet workSheet = workBook.CreateWorkSheet("Sales Data");

// Write headers
workSheet["A1"].Value = "Product";
workSheet["B1"].Value = "Units Sold";
workSheet["C1"].Value = "Revenue";

// Write data rows
workSheet["A2"].Value = "Widget Alpha";
workSheet["B2"].Value = 450;
workSheet["C2"].Value = 22500;

workSheet["A3"].Value = "Widget Beta";
workSheet["B3"].Value = 310;
workSheet["C3"].Value = 15500;

// Add a formula
workSheet["C4"].Formula = "=SUM(C2:C3)";

// Save the Excel file
workBook.SaveAs("sales_report.xlsx");
Console.WriteLine("Spreadsheet saved successfully.");

出力

Excelオブジェクトを解放するC#: IronXLを使用して持続するExcelプロセスを停止する: 画像4 - Interopなしで作成されたExcelファイル

このアプローチにより、Excelアプリケーションオブジェクトの管理、未保存の変更に関するプロンプトの処理、メインスレッドがSTAアパートメントモデルを使用することの保証といった複雑な作業が不要になります。 IronXLは、Officeアドインへの依存やInteropアセンブリの登録といった煩雑な作業なしに、スプレッドシート機能へのアクセスを簡素化します。

より複雑な操作が必要なシナリオでは、IronXLが数式の評価セルのスタイリング、およびマルチシートワークブックの方法を提供します。 COMオブジェクトのライフサイクル管理を気にすることなく、Excelワークシートのデータを操作したり、書式設定を適用したり、複数のファイル形式にエクスポートしたりするコードを記述できます。

Excel Interopとダイレクトライブラリの主な違いは何ですか?

以下の表は、2つのアプローチ間の最も重要な違いをまとめたものです。

C#アプリケーションにおけるExcel InteropとIronXLの比較
能力Excel InteropIronXL
Microsoft Officeが必要ですはいなし
COMオブジェクトのクリーンアップマニュアル(すべてのオブジェクト)自動(.NET GC)
EXCEL.EXEが残存するリスク高いなしne
サーバー環境で動作します制限あり(STAスレッドが必要)はい(すべての環境)
Docker / Linux のサポートなしはい
サポートされているファイル形式XLS、XLSX(Office経由)XLS、XLSX、CSV、TSV、JSON
スレッドの安全性STAのみマルチスレッド
コードの複雑さ(基本的な読み取り)高(リリース呼び出しが多い)低(3~5行)

Excelオブジェクトを解放するC#: IronXLを使用して持続するExcelプロセスを停止する: 画像2 - InteropとIronXLの比較表

IronXLは、CSVファイルの読み取りデータをCSVにエクスポートExcelチャートの操作、および条件付きフォーマットの適用をサポートしています。 これらの機能はすべてOfficeへの依存なしに利用できるため、 IronXLはデスクトップアプリケーションとサーバーサイドアプリケーションの両方に適しています。

高度なシナリオの詳細については、 IronXLのドキュメントおよびIronXL APIリファレンスを参照してください。 IronXLのサンプルギャラリーには、一般的なExcel自動化タスクを網羅した、すぐに使えるコードサンプルが豊富に用意されていますので、ぜひご覧ください。

Excelの数式とデータ検証についてはどうでしょうか?

IronXLはネイティブにExcel数式の読み書きをサポートしています。 セルのFormulaプロパティを設定できます。IronXLはその数式をファイルに保存し、評価します。 データ検証ルールに関しては、IronXLはドロップダウンリスト、数字の範囲制約、および日付の検証をサポートしており、Excelを使用して計算を行う必要はありません。

ライブラリはまた、Excelパスワード保護結合セル、およびExcelフリーズペインの構成を処理します。 各機能の詳細な手順については、 IronXLのチュートリアルを参照してください。

Excel Interopからネイティブ.NETライブラリへの移行方法を教えてください

既存のInteropベースのコードベースをIronXLに移行するには、通常、次の4つのステップが必要です。

  1. Microsoft.Office.Interop.Excel NuGet参照とCOM登録を削除します。
  2. NuGetを通じてIronXL.Excelをインストールします。
  3. Interopオブジェクトの作成をIronXLの同等品(WorkBook.Create)に置き換えます。
  4. すべてのGC.Collectパターンを削除します。

ほとんどのプロパティ名は直感的にマップされます: workbook.SaveAs(path)はほとんど同じままです。 IronXL移行ガイドでは、一般的な変換パターンをカバーしています。

注目すべき分野の一つは、糸通しです。 相互運用にはSTAスレッドが必要であり、 ASP.NETでは特定のスレッドプール構成が強制されます。 IronXLに切り替えた後、任意の[STAThread]属性とスレッドアパートメント設定を削除できます。IronXLはデフォルトでスレッドセーフです。

多数のファイルにわたる大規模な移行の場合、 IronXLのバッチ処理の例では、並列ループと非同期パターンを使用して数百のExcelファイルを効率的に処理する方法を示しています。

次のステップは何ですか?

Excel InteropにおけるCOMオブジェクトのクリーンアップ問題は、長年にわたり.NET開発者を悩ませてきた。 すべての中間オブジェクトを追跡し、適切な順序で解放し、参照を漏洩させることなく例外を処理することは、本来単純なスプレッドシート操作であるはずの作業に、著しい複雑さを加えることになる。

IronXLは、よりクリーンな未来への道筋を提供します。 Microsoft Officeとは独立してExcelファイル形式を直接操作することで、COMオブジェクトの問題を根本から解消します。 既存ファイルの読み込み、新規ファイルの作成、大規模なバッチ処理など、どのような場合でも、 IronXLは最新 for .NET開発が求めるシンプルさでExcelスプレッドシート操作を処理します。

開始するには:

IronXLの無料トライアル版をダウンロードして、ご自身のプロジェクトでお試しください。 IronXLのアーキテクチャとAPIの詳細については、ドキュメントを参照してください。 IronXLのサンプルギャラリーを参照して、読み込み、書き込み、書式設定、数式評価に関するコードサンプルを確認してください。

  • ロイヤリティフリーの再配布を含むライセンスオプションについては、 IronXLの価格ページをご覧ください。

.NETエコシステム内の他のExcelライブラリとの比較については、 MicrosoftのExcel相互運用に関するドキュメントEPPlusライブラリのGitHubリポジトリ、およびClosedXMLプロジェクトを参照して、各オプションのトレードオフを理解してください。 IronXLの強みは、豊富なAPI、Office不要の導入環境、そして単一の商用ライセンスで完全なクロスプラットフォームサポートを実現している点です。

Curtis Chau
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

...
詳しく読む

関連する記事

Key in blue circle

無料の30日間トライアルキーをすぐに入手してください。

Your trial license will be sent to your email address

制限なし。100% ロック解除済み。クレジットカード不要。

bullet_checkedクレジットカードやアカウントの作成は不要です。制限なし。100% ロック解除済み。クレジットカード不要。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
無料のライブデモを予約する
Booking Badge

世界中の数百万人のエンジニアから信頼されています。

ライセンスはより安く
義務のない相談を受ける
下記のフォームを記入するか、sales@ironsoftware.comにメールしてください。
あなたの詳細は常に守秘されます。
世界中の数百万人のエンジニアから信頼されています。
ライセンスはより安く
あなたの無料30日間の試用キーをすぐに入手。
クレジットカードやアカウントの作成は不要です。