C#Excel 2007 RTD服务器在退出时崩溃

本文关键字:退出 崩溃 服务器 2007 RTD C#Excel | 更新日期: 2023-09-27 18:20:04

我已经根据Kenny Ker在c#中的多个主题编写了一个c#RTD服务器

他的设计和我的主要区别在于,我的数据来自WCF客户端。我使用相同类型的计时器,每隔几秒钟我就会调用m_callback.UpdateNotify();。我的RefreshData方法使用主题值调用WCF客户端中的一个函数,并将结果用作excel的值。一切都很好。

当我关闭excel时,问题就来了。

当我关闭Excel时,我会收到一个消息框,上面写着"Microft Excel已停止工作"

我的ServerTerminate()方法清除了我的所有主题,在我的WCF客户端上调用close,然后毫无错误地退出。

我认为问题可能是COM问题,所以我尝试添加

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

弹出窗口仍然显示,所以我尝试添加

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

添加这些行确实会引发异常。如果我忽略异常excel关闭没有任何问题,但如果我在装有excel 2010的计算机上安装RTD服务器,那么弹出框仍然存在。

我有Excel 2007(12.0.6665.5003)SP3 MSO(12.0.6662.5000)我正在使用Visual Studio 2008开发我的c#RTD服务器,我的项目引用了Microsoft.Office.Interop.Excel 12.0.0.0版本

C#Excel 2007 RTD服务器在退出时崩溃

这个问题相当模糊,但那是因为我真的不知道从哪里开始。每件事似乎都运转正常。

玩过这些代码后,我注意到我有一个实现IDisposable的对象,当我完成它时,我对它调用了Dispose。该对象还有一个名为Dispose的终结器。我用受保护的Dispose(bool)将其更改为更像这样。

我还再次删除了Kenny Ker的Excel程序集(然而,仅仅复制他的代码是不起作用的。实际上,我直接从Excel互操作程序集复制了接口)。

在这样做之后,我可以去掉上面添加的行(用于整理垃圾收集),excel现在可以毫无问题地关闭了。