0

我已经根据Kenny Ker 的 C# 中的多个主题编写了 ac# 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关闭没有任何问题,但如果我将我的RTD服务器安装在具有excel 2010的计算机上,那么弹出框仍然存在。

我有 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

4

1 回答 1

0

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

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

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

这样做之后,我能够摆脱我在上面添加的行(用于编组垃圾收集),并且 excel 现在可以毫无问题地关闭。

于 2013-06-27T13:16:56.847 回答