2013-07-16 39 views
2

我写了一个使用Visio interop的C#应用​​程序。我遇到一个令我困惑的事件相关问题。 重现步骤:C#Visio Interop,事件处理程序不被调用

  1. 启动的Visio
  2. 启动我的申请。 Visio实例被回收,可以使用对象模型,并在我的应用程序中接收和处理事件。
  3. 关闭我的应用程序 - 让Visio保持打开状态。
  4. 启动我的应用程序。 Visio实例被检索并且可以使用对象模型,但事件不会被我的应用程序接收。

当我的应用程序打开时,它使用检索的实例,以开放的Visio应用:

visioApp = (Microsoft.Office.Interop.Visio.Application)Marshal.GetActiveObject("Visio.Application"); 

我注册像这样的事件:

visioApp.DocumentOpened += new EApplication_DocumentOpenedEventHandler(onDocOpened); 

当我的应用程序关闭时,我注销这样的事件:

visioApp.DocumentOpened -= onDocOpened; 
visioApp = null; 

看起来好像我n当我的应用程序关闭时正确取消注册/让实例进入,但那只是一个猜测。当我的应用程序第二次启动时,我没有收到任何错误 - 它只是不响应事件。我一直没有找到任何进一步的相关信息在线(可能只是没有搜索正确的条款)。任何帮助是极大的赞赏!我会提供更多可能有用的信息。

@Oscars的答案是正确的:

Marshal.FinalReleaseComObject(_ap); 

但是我有一个额外的问题。 Marshal.finalReleaseComObject在类析构函数中被调用,这在应用程序关闭序列中显然被调用得太晚(即使我强制垃圾收集),并且没有正确地释放引用。我现在先调用此代码(在MainForm_Closing事件中),它运行良好。谢谢您的帮助!

回答

0
+0

我认为这是极有可能的问题第 –

+0

@Oscar我实际上已经试过Marshal.ReleaseComObject的,但它没有似乎工作中我的应用程序。但是,我构建了一个测试应用程序,只需检索对visio的引用,对事件作出响应,然后释放visio引用即可。这工作完美无瑕。我将不得不通过我的代码进行更多的挖掘,以确保我已经正确释放了通过互操作获得的所有对象(文档,表单,形状等)。谢谢你的帮助!至少现在我在正确的轨道上! – Controlsfreek

+0

请记住2点规则。祝你好运! – Oscar