Правильный способ закрытия приложения Excel - PullRequest
0 голосов
/ 06 марта 2012

Я пишу приложение, которое обращается к файлу Excel с помощью этого кода:

RBTApplication = new Excel.Application();
RBTWorkbooks = RBTApplication.Workbooks;
RBTWorkbook = RBTApplication.Workbooks.Open(
    RBTDataSet.Instance.FilePath, 0, true, 5, "", "", true,
    Microsoft.Office.Interop.Excel.XlPlatform.xlWindows,
    "\t", true, false, 0, true, 1, 0 );
RBTWorksheet = (Excel.Worksheet)RBTWorkbook.Worksheets.get_Item( 1 );
RBTRange = RBTWorksheet.UsedRange;

После загрузки нужных мне данных я пытаюсь закрыть приложение Excel с помощью этого фрагмента кода:

RBTWorkbook.Close();
RBTApplication.Quit();
RBTWorksheet.ReleaseComObject();
RBTWorkbook.ReleaseComObject();
RBTWorkbooks.ReleaseComObject();
RBTApplication.ReleaseComObject();

Моя проблема в том, что процесс EXCEL.EXE все еще выполняется.Простое решение, такое как уничтожение всех процессов Excel, звучит не очень хорошо, так как мой процесс может быть одним из многих электронных таблиц, используемых одновременно.Это также влияет на открытие новых таблиц Excel - каждый открывается как доступный только для чтения, пока я не убью этот процесс.

Итак ... как правильно закрыть это приложение ИЛИ уничтожить этот конкретный процесс (есть ли способполучить PID из COM-объекта?).Я думаю, что нашел один (не пробовал) - получить список процессов exll до и после открытия нового ExcellApp, сравнить списки (получить разницу), убить определенный процесс, зная его PID.Но это решение не похоже на правильный способ обработки COM-объектов и других приложений из моего приложения.

1 Ответ

4 голосов
/ 06 марта 2012

Вы не отпускаете все свои COM-объекты.

Например:

RBTApplication.Workbooks.Open

Будет создан экземпляр объекта Workbooks, как:

RBTWorkbook.Worksheets.get_Item

Вместо этого используйте объект Worksheets, который вы уже создали:

RBTWorkbooks = ...
...
RBTWorkbooks.Open(...)
RBTWorkbooks.get_Item(...)

Если ваши требования к взаимодействию просты, а код взаимодействия локализован, вы можете с осторожностью убедиться, что вы освободили все COM-объекты, на которые вы ссылаетесь, в идеале, используя try / finally, чтобы убедиться, что они освобождены, даже если выброшено исключение ,

Однако вам или программисту по техническому обслуживанию очень легко забыть о нем, поэтому вы можете захотеть взглянуть на принудительную сборку мусора, например см. Ответы на этот вопрос.

...