为啥 IDisposable 具有 [ComVisible(true)] 属性?

Posted

技术标签:

【中文标题】为啥 IDisposable 具有 [ComVisible(true)] 属性?【英文标题】:Why does IDisposable have the [ComVisible(true)] attribute?为什么 IDisposable 具有 [ComVisible(true)] 属性? 【发布时间】:2013-11-16 19:26:28 【问题描述】:

我继承了我工作的一个大型遗留 ASP.NET 应用程序,我们公司希望我们使用 FxCop 并修复所有主要的违规行为。目前似乎很流行的一条规则如下:

CA1405: COM visible type base types should be COM visible

似乎我们应用程序中的每个 ASP.NET 页面/控件都违反了此规则。一开始我不知道为什么,但最终我意识到这是由于以下继承链:

System.IDisposable → System.Web.UI.Control → System.Web.UI.TemplateControl → System.Web.UI.Page

我也意识到IDisposable被定义为:

[ComVisible(true)]
public interface IDisposable

  void Dispose();

总结一下:所有 ASP.NET 页面/控件都继承自 IDisposable,而IDisposable 具有 [ComVisible(true)] 属性,这意味着所有页面/控件都将不符合此规则。

这对我们很不利,因为我们的应用程序有数千个页面和控件,因此有数千个违规行为。禁用规则不是一种选择,因为我们有一套“公司标准”的 FxCop 规则。 FxCop 似乎希望我们在应用程序的每个页面上都添加这个属性,而我真的没有兴趣这样做。

我的问题是,为什么IDisposable 首先有[ComVisible(true)] 属性?

【问题讨论】:

这样的公司标准规则一般都“烂透了”。如果它真的是标准的,那么你只需要完成这项工作。如果您不乐意这样做,也许让实习生\初级开发人员来做?我认为(并且已经)每个项目或产品都应该维护自己的一套规则。 @edtheprogrammerguy:我不明白这是一个类似的问题——那家伙甚至没有提到ComVisible @cristobalito:是的,它确实很烂,并不是说它很难,而是它以一种似乎没有任何价值的方式弄乱了代码跨度> 因为 11 年前,.NET 1.0 版本不可能忽视当时流行的编程标准。如果它忽略 COM,它就不会有滚雪球的机会,它在当时是统治者。包括 ASP,还没有 .Net。哦,我们忘记的速度有多快 :) 显然,这些知识对帮助您毫无用处,您肯定已经知道那个吗? 【参考方案1】:

IDisposable 被标记为 COMVisible,以便在 COM 应用程序中使用 .Net 组件时允许处置资源。

在从 VB6 应用程序过渡到完整的 .Net 应用程序时,我们实际上大量使用了这一点:我们能够在旧版 VB6 应用程序中重用 .Net 功能(数据库访问),但必须使用 IDispose 接口来确保这样的事情当我们使用完对象时,数据库连接已正确清理。

【讨论】:

以上是关于为啥 IDisposable 具有 [ComVisible(true)] 属性?的主要内容,如果未能解决你的问题,请参考以下文章

为啥是 IDisposable 接口? [复制]

为啥 Enumerable.Range 实现 IDisposable?

为啥 FxCop 坚持使用 IDisposable 作为结构

PetaPoco.Database 实现了 IDisposable,那么为啥大多数示例没有“使用”语句呢?

IDisposable 和托管资源 [重复]

为啥在 BinaryReader 上调用 Dispose() 会导致编译错误?