我已在2010年和2013年的项目中复制了这个问题。
我使用Visual Studio 2010开发了一个VSTO插件。在这个插件中,我暴露了一个COMVisible方法。
我还有一个不同的(非.NET)应用程序,然后实例化Project COM对象,搜索我的插件并调用我标记为COMVisible的方法。
这会导致Project打开一个“新”项目文件并向其写入内容。
这个非.NET应用程序在我的插件中调用COM方法后,会停止执行(不关闭MS Project)。
然后我关闭新创建的项目(不是MS Project,只是文件)。一切都好;但是,当我尝试关闭MS Project时,它会无限期地挂起。在任务管理器中,它仍显示为“正在运行”,单击“MS Project”窗口会显示“切换到”,“重试”,“取消”对话框,通知我其他应用程序正忙...令人惊讶的是,如果我选择不关闭新创建的Project文件,只需关闭MS Project窗口,它就会正常关闭。
这里可能会发生什么?
答案 0 :(得分:0)
好的,经过多次调查,我找到了问题的答案。基本上从我的VSTO Addin公开的COM类需要继承“StandardOleMarshalObject”。
原因是因为我的Addin中的COM方法正在访问辅助线程(调用应用程序的线程)上的项目对象模型。这是一个很大的不。从该类编组派遣所有调用该辅助线程到主UI线程,从而解决问题。