C# Excel 2007 RTD Server аварийно завершает работу при выходе

Я написал сервер ac# RTD на основе Множественных тем Кенни Кера в С#

Основное различие между его дизайном и моим в том, что мои данные исходят от клиента WCF. Я использую тот же тип таймера и каждые пару секунд вызываю m_callback.UpdateNotify();. Мой метод RefreshData вызывает функцию в моем клиенте WCF со значениями темы и использует результат в качестве значения для Excel. Все отлично работает.

Проблема возникает, когда я закрываю Excel.

Когда я закрываю Excel, я получаю окно с сообщением «Microft Excel перестал работать».

Мой метод ServerTerminate() очищает все мои темы, вызывает close на моем клиенте WCF и завершает работу без ошибок.

Я думал, что проблема может быть проблемой COM, поэтому я попытался добавить

while ( Marshal.ReleaseComObject( m_callback ) > 0 ) ;
m_callback = null;

Всплывающее окно по-прежнему отображалось, поэтому я попытался добавить

GC.Collect();
GC.WaitForPendingFinalizers(); //SEHException thrown from this
GC.Collect();
GC.WaitForPendingFinalizers();

Добавление этих строк вызывает исключение. если я игнорирую исключение, Excel закрывается без проблем, но если я устанавливаю свой RTD-сервер на компьютер с Excel 2010, всплывающее окно все еще там.

У меня есть Excel 2007 (12.0.6665.5003) SP3 MSO (12.0.6662.5000). Я разрабатываю свой сервер RTD c# с помощью Visual Studio 2008, и мой проект имеет ссылку на Microsoft.Office.Interop.Excel версии 12.0.0.0.


person MarkB42    schedule 26.06.2013    source источник
comment
Не могли бы вы подробнее рассказать о том, как вы заставили его работать при удалении сборки Excel, пожалуйста. Я пытался копировать точно такие же интерфейсы, те же GUID, сохраняя идентификаторы TypeLibType и DispId, но безуспешно. Также комбинируйте эти интерфейсы с параметрами MarshalAs, как это предлагается в Кенни Кер. Однако он работает только в начале, когда он подключается к ConnectData(), потому что я вижу данные, но после того, как он начинает обновляться, получает N/A, и после этого вообще никогда не видит никаких данных. Есть ли возможность, если вы вставите сюда интерфейсы или отправите   -  person Victor E    schedule 14.02.2014
comment
Мне пришлось использовать Object Browser на сборках взаимодействия, чтобы все было правильно. Но вот файл, который я использовал. Однако с тех пор я перешел на использование ExcelDna и очень рекомендую его.   -  person MarkB42    schedule 14.02.2014


Ответы (1)


Вопрос был довольно расплывчатым, но это потому, что я действительно понятия не имел, с чего начать. Казалось, все работает правильно.

Поэкспериментировав с кодом, я заметил, что у меня есть объект, реализующий IDisposable, для которого я вызвал Dispose, когда закончил работу с ним. У объекта также был финализатор Dispose. Я изменил его, чтобы он больше походил на этот с защищенным Dispose(bool).

Я также удалил сборку Excel для Кенни Кер снова ( однако просто копирование его кода не сработало.Я фактически скопировал интерфейсы прямо из сборки excel interop).

После этого я смог избавиться от строк, которые я добавил (для сортировки сбора мусора) выше, и теперь Excel закрывается без проблем.

person MarkB42    schedule 27.06.2013