Привет всем, я читал о многих людях, которым трудно закрывать экземпляры запущенного приложения Excel, созданного с использованием объектов Com. Мне удалось время от времени вызывать полное закрытие экземпляров Excel, но не всегда (я вернусь к этому позже).
Моя проблема гораздо сложнее, чем просто закрыть работающий экземпляр Excel, так как я пытаюсь создать приложение, которое будет:
Создайте файл Excel, используя один из множества доступных шаблонов (это прекрасно работает)
Заполните ячейки шаблона в зависимости от критериев, выбранных в моем приложении (также отлично работает)
Позволяет пользователям продолжать ввод значений, которые не могут быть получены из данных в моем приложении (вот что делает закрытие процессов и удаление com-объектов более сложным)
Сохранение данных при закрытии Excel (я могу заставить это работать без очистки ссылок на com-объекты, однако это, очевидно, означает, что процесс Excel не был завершен, попытался очистить ссылки на com-объекты, но затем он не позволит сохранить рабочий лист ПОСЛЕ того, как пользователь закроет Excel или не так, как я его реализовал).
В идеале я хотел бы прекратить процесс Excel, когда пользователь закрывает Excel. (Вот в чем проблема)
Что касается очистки объекта com, у меня есть метод очистки, такой как:
private void cleanUp()
{
for (int i = 0; i < ranges.Count; i++)
{
ranges[i] = null;
}
for(int i = 0; i < worksheets.Count; i++)
{
worksheets[i] = null;
}
for (int i = 0; i < worksheetwrappers.Count; i++)
{
worksheetwrappers[i] = null;
}
for (int i = 0; i < workbooks.Count; i++)
{
while (System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks[i]) > 0)
{
workbooks[i].Close(false, "", false);
workbooks[i] = null;
}
}
for (int i = 0; i < instances.Count; i++)
{
while (System.Runtime.InteropServices.Marshal.ReleaseComObject(instances[i]) > 0)
{
instances[i].Quit();
instances[i] = null;
}
}
}
Мне еще предстоит сделать рефакторинг и сделать его красивым и опрятным, так что, к сожалению, вы получаете самые основы того, что у меня есть.
В основном моя проблема состоит в том, чтобы знать, когда утилизировать все com-объекты и когда выполнять очистку, поскольку пользователь должен ввести больше данных после заполнения электронной таблицы, то есть я не могу автоматически выполнить очистку после того, как электронная таблица имеет был заселен.
Мне интересно, придется ли мне использовать какой-то наблюдатель для прослушивания, когда Excel закрывается, а затем избавиться от всех объектов Com (что является болью) или если у кого-то есть какая-то умная идея, о которой я не думал из.
Спасибо за любую помощь,
Nic