一段时间以来,我在Visual Studio 2010的VSIX包中发现了间歇性的COM问题.尝试订阅IDE的基于COM的事件接收器之一会随机抛出以下错误:
“无法使用已与其基础RCW分离的COM对象”
一个repro案例归结为这个代码(显然必须在VSIX中使用):
using System; using EnvDTE; using EnvDTE80; class Test { private readonly Events _events; private readonly Events2 _events2; private readonly BuildEvents _buildEvents; private readonly ProjectItemsEvents _projectItemsEvents; public Test(IServiceProvider provider) { var dte = (DTE)provider.GetService(typeof(DTE)); var dte2 = (DTE2)dte; // Store all references in fields as a GC precaution. _events = dte.Events; _events2 = (Events2)dte2.Events; _buildEvents = _events.BuildEvents; _projectItemsEvents = _events2.ProjectItemsEvents; // Proceed to subscribe to event sinks. _buildEvents.OnBuildBegin += BuildBeginHandler; // BOOM! _projectItemsEvents.ItemAdded += ItemAddedHandler; } private void ItemAddedHandler(ProjectItem projectItem) { } private void BuildBeginHandler(vsBuildScope scope,vsBuildAction action) { } }
我已经从网上可以找到的类似问题的大量描述中了解到可能的原因.它基本上是在COM互操作期间Runtime Callable Wrappers和GC交互方式的副作用.这是一个类似的问题link完成解释.
我对这个解释很好,特别是因为它提示了一个简单的解决方法 – 将事件接收器引用存储在一个字段中,以防止它过早地GC.实际上,许多人似乎已经以这种方式解决了他们的问题.
困扰我的是它在我的情况下不起作用.我真的很难过为什么.正如您可以清楚地看到的那样,我已经将所有对象引用存储在字段中作为预防措施.但错误仍然存在.我试着在ctor结束时使用GC.KeepAlive()调用更加明确,但无济于事.还有什么要做的吗?
如果没有解决方案,我的VSIX随机无法加载,只为用户提供一个选项:重启Visual Studio并希望下次不会发生.
任何帮助将真正受到赞赏!
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。