C # .net Excel Interop оставляет процесс Excel зависшим - PullRequest
1 голос
/ 23 июня 2010

Мы используем взаимодействие Excel во многих местах в нашем коде, однако у меня есть одна функция, которая, кажется, никогда не закрывает процесс Excel, который он использует. Я упростил код, и мне кажется, что всякий раз, когда яоткройте рабочую книгу в этой функции, она остается без дела.Я включил приведенный ниже код, я убедился, что каждый объект определен, освобожден и обнулен, и, тем не менее, Excel продолжает работать.

        System.Data.DataTable dtExcelSheet = new System.Data.DataTable();
        Microsoft.Office.Interop.Excel.Application excelObject = new Microsoft.Office.Interop.Excel.Application();

        dtExcelSheet.Columns.Add("SheetName", typeof(string));
        dtExcelSheet.Columns["SheetName"].ReadOnly = false;
        dtExcelSheet.Columns["SheetName"].Caption = "Sheet Name";


        Workbooks wbs = excelObject.Workbooks;

        Workbook excelWorkbook = wbs.Add(excelFile);

        excelWorkbook.Close(false, System.Reflection.Missing.Value, System.Reflection.Missing.Value);
        wbs.Close();
        excelObject.Quit();

        int i1 = Marshal.FinalReleaseComObject(excelWorkbook);
        int i2 = Marshal.FinalReleaseComObject(wbs);
        int i3 = Marshal.FinalReleaseComObject(excelObject);


        excelWorkbook = null;
        wbs = null;
        excelObject = null;

        GC.GetTotalMemory(false);
        GC.Collect();
        GC.WaitForPendingFinalizers();
        GC.Collect();
        GC.GetTotalMemory(true);       

Ответы [ 5 ]

1 голос
/ 26 августа 2010

Я попытался запустить ваш код, но не смог воспроизвести проблему. Если я прохожу через него с помощью отладчика, процесс Excel завершается после последнего вызова FinalReleaseComObject. Возможно ли, что виновник лежит в каком-то коде, которого нет в вашем списке?

При использовании COM-взаимодействия я обнаружил, что слишком легко увеличить счетчик ссылок на COM-объекты очень тонкими способами. Например, допустим, вы делаете что-то вроде этого:

excelWorkbook.Foo.Bar();

Это может увеличить счетчик ссылок на объект Foo, оставляя вас без средств для его последующего освобождения ... и оставляя процесс Excel задерживаться, пока вы не закроете свое приложение. Вы можете переписать приведенную выше строку кода следующим образом:

Foo foo = excelWorkbook.Foo;
foo.Bar();
Marshal.ReleaseComObject(foo);

Это не так красиво, но это уменьшит счетчик ссылок на объект Foo после того, как вы его закончили.

1 голос
/ 23 июня 2010

Полное предположение, но эта строка:

dtExcelSheet.Columns.Add("SheetName", typeof(string));

вернуть созданный столбец?

Если это так, вам, вероятно, потребуется сохранить эту ссылку и очистить ее в конце.

Редактировать: Кроме того, я не думаю, что вы должны устанавливать переменные в нуль в конце, я думаю, что просто снова обращается к ним.

И вам не нужно просить GC собирать и т. Д., Но я предполагаю, что это может быть ваш тестовый код.

1 голос
/ 23 июня 2010

Прошло много времени с тех пор, как я разбирался с этими вещами, поэтому у меня ничего не выскакивает.

Моя обычная рекомендация в этих случаях - установить объект приложения Excel на Visible = true, чтобы увидетьнет диалога, появляющегося на вас.Excel / Word иногда отказывается закрываться, если им кажется, что модальное диалоговое окно открыто независимо от того, что еще вы можете сделать.В любом случае, это первое, что нужно проверить.

1 голос
/ 23 июня 2010

Убедитесь, что вы не вызываете Excel в фоновом потоке.У меня была похожая проблема, когда я чистил все COM-объекты, но Excel все еще не умирал, и это оказалось проблемой.

Я записал свой опыт и решение здесь .

0 голосов
/ 26 августа 2010

То же самое случилось со мной на днях. См. Мой вопрос по Excel Automation относительно исправления (вопрос касается, главным образом, удаления нескольких строк, но у меня также была такая же проблема, как вы выяснили, это связано с правильным освобождением всех объектов COM). *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...