非常に重いExcelワークブックのセットを開くために、COM InteropライブラリでC#を使用しようとしています。マクロを起動し、いくつかのセルを移動し、私の会社が使用するカスタムエクセルアドインを開始する必要があるため、C#を使用する必要があります。C#ExcelオートメーションでExcelのメモリリークが発生する
その後、プログラムが終了し、ワークブックが別のExcelインスタンスに開かれたままになります。私は、プログラムの終了時にブックを閉じたくはありません。
問題は、私のC#プログラムが終了すると、元の500 MBから3.5ギガのメモリを消費するまで、エクセルブックが徐々に多くのメモリを消費するということです。
私は手でワークブックを開くのに使っていましたが、シートはあまりメモリを消費しませんでした。一度C#を使用してそれらを開くと、メモリ使用量が極端に多くなってしまいました。私の理論は何とか、私はCOM Excelオブジェクトと対話するとき、私はメモリリークを作成します。以下は
は私の元のコードです:私はあなたが用途を解放するために元帥を使用する必要があるかについて読んusing Excel = Microsoft.Office.Interop.Excel;
...
excelApp = new Excel.Application();
excelApp.Visible = true;
excelApp.Workbooks.Open(filename, misValue, misValue, misValue, misValue, misValue,
true, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue);
excelApp.Calculation = Excel.XlCalculation.xlCalculationAutomatic;
ので、私は今、他の、次のコードをしようとしたが、それをテストする簡単な方法がありませんよすべてのシートを開き、データが多すぎるかどうかを確認するよりも
excelApp = new Excel.Application();
excelApp.Visible = true;
Excel.Workbooks currWorkbooks = excelApp.Workbooks;
Excel.Workbook currWorkbook = currWorkbooks.Open(filename, misValue, misValue, misValue, misValue, misValue,
true, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue);
//excelApp.Calculation = Excel.XlCalculation.xlCalculationAutomatic;
int x = Marshal.ReleaseComObject(currWorkbook);
currWorkbook = null;
int y = Marshal.ReleaseComObject(currWorkbooks);
currWorkbooks = null;
あなたは既にcurrWorkbookをnullに設定しています。なぜ2回それをやっていますか?また、Mashal.ReleaseComObject(currWorkBook)は、オブジェクトが解放されたかどうかをチェックするためにIntを割り当てるのがなぜ必要なのですか?何かエラーが発生していますか? – MethodMan
私は何のエラーもありません。問題はこのように開始されたワークブックを凌駕し、徐々にメモリを消費します。 – user804649
EPPlus(http://epplus.codeplex.com/)をチェックしてみてください。私はそれがどのようなタイプのマクロサポートを持っているのかはよく分かりませんが(VBAは機能として言及しています)、一般的には、ExcelPopusはExcel Interopよりはるかに効率的でトラブルの発生が少ないと言えます。 – devuxer