c# – VSIX中令人讨厌的COM互 *** 作问题

c# – VSIX中令人讨厌的COM互 *** 作问题,第1张

概述一段时间以来,我在Visual Studio 2010的VSIX包中发现了间歇性的COM问题.尝试订阅IDE的基于COM的事件接收器之一会随机抛出以下错误: “无法使用已与其基础RCW分离的COM对象” 一个repro案例归结为这个代码(显然必须在VSIX中使用): using System;using EnvDTE;using EnvDTE80;class Test{ priv 一段时间以来,我在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并希望下次不会发生.

任何帮助将真正受到赞赏!

解决方法 好吧,我放弃了,只是做了我脑子里唯一想到的事情.我认为,由于这显然是一种竞争条件,我不能以可预测的方式影响,如果我输了,我不妨重新参加比赛.

所以我将订阅行移动到了一个while循环中,尝试…捕获它们并在一些Thread.Sleep()之后重试.当两个订阅成功或者我连续失去比赛超过2秒时,循环退出.

踢球者是,自从我实施改变以来,我没有输过一次比赛.真正的HeisenBUG,如果我看过一个.

无论如何,我将坚持这一点,直到我找到适当的解决方案或再次出现错误.

总结

以上是内存溢出为你收集整理的c# – VSIX中令人讨厌的COM互 *** 作问题全部内容,希望文章能够帮你解决c# – VSIX中令人讨厌的COM互 *** 作问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1228172.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存