Как убедиться, что Excel закроется, когда все выдающиеся ссылки исчезнут - PullRequest
0 голосов
/ 03 июля 2019

Мое приложение запускает и автоматизирует 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 вне процесса не завершит работу, когда последний объект в сеансе будет освобожден:

enter image description here

Сбой лучше

Это становится проблемой, если при автоматизации возникает непредвиденное исключение.Обычно, чтобы избавиться от 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...