为什么 IDisposable 有 [ComVisible(true)] 属性?
-
21-12-2019 - |
题
我继承了我工作的一个大型遗留 ASP.NET 应用程序,我们的公司希望我们使用 FxCop 并修复所有主要的违规行为。目前,似乎流行的规则如下:
CA1405:COM 可见类型 基类型应该是 COM 可见的
看来我们应用程序中的每个 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)]
首先属性?
解决方案
IDisposable 被标记为 COMVisible,以便在 COM 应用程序中使用 .Net 组件时允许处置资源。
实际上,当从 VB6 应用程序过渡到完整的 .Net 应用程序时,我们大量使用了它:我们能够在旧版 VB6 应用程序中重用 .Net 功能(数据库访问),但必须使用 IDispose 接口来确保在使用该对象后正确清理数据库连接等内容。
不隶属于 StackOverflow