Мое приложение запускает и автоматизирует Excel:
Guid CLSID_ExcelApplication = ClsidFromProgID("Excel.Application");
Application xl = CoCreateInstance(CLSID_ExcelApplication);
А теперь мы в гонках:
Workbook wb = xl.Workbooks.Add();
Worksheet ws = wb.Worksheets[1];
ws.Name = "Monthly Expense Report";
И тогда обычно вы можете .Quit
Excel:
xl.Quit();
И Excel уходит.
Введите UserControl
Что должно произойти , если бы у меня был код:
Application xl = CoCreateInstance(CLSID_ExcelApplication);
xl.UserControl = false;
Workbook wb = xl.Workbooks.Add();
Worksheet ws = wb.Worksheets[1];
ws.Name = "Monthly Expense Report";
ws = null;
wb = null;
xl = null;
Затем Excel автоматически закрывается, когда исчезает последняя ожидающая ссылка.Из MSDN:
Свойство Application.UserControl (Excel)
Когда свойство UserControl имеет значение False для объекта, этот объект освобождается при последней программной ссылкек объекту освобождается.Если это свойство равно False , Microsoft Excel закроется, когда будет выпущен последний объект в сеансе.
Я просто обращу внимание на эту важную строку в документации выше:
Microsoft Excel завершает работу при освобождении последнего объекта в сеансе
Когда .UserControl
имеет значение false, Excel должен автоматически завершать работу.
Свойство .UserControl
по умолчанию имеет значение false .Но даже если я установлю значение false , объект автоматизации Excel вне процесса не завершит работу, когда последний объект в сеансе будет освобожден:
Сбой лучше
Это становится проблемой, если при автоматизации возникает непредвиденное исключение.Обычно, чтобы избавиться от Excel, вы должны:
Сделать его видимым и позволить пользователю закрыть его:
xl.Visible = true;
xl.UserControl = true; //prevent Excel from terminating when we null our reference below
xl = null
или позвоните .Quit
, чтобы выйти:
xl.Quit();
xl = null;
За исключением случаев возникновения катастрофической проблемы, у меня нет возможности позвонить .Quit
или позвонить .Visible = true
.И в этих случаях Excel торчит.За дни, недели и месяцы иногда это может означать буквально дюжину из них.
Что я могу сделать, чтобы Excel закрылся, когда исчезнет последняя выдающаяся ссылка на него:
Application xl = CoCreateInstance(CLSID_ExcelApplication);
xl.UserControl = false;
Workbook wb = xl.Workbooks.Add();
Worksheet ws = wb.Worksheets[1];
ws.Name = "Monthly Expense Report";
ws.Cells[1,2] = "January";
ws.Ce......CRASH