Почему IDisposable имеет атрибут [ComVisible(true)]?
-
21-12-2019 - |
Вопрос
Я унаследовал большое устаревшее приложение ASP.NET, в котором работаю, и наша компания хочет, чтобы мы использовали FxCop и исправляли все основные нарушения правил.В настоящее время преобладающим правилом является следующее:
СА1405:Базовые типы видимого типа 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, чтобы разрешить удаление ресурсов, когда компонент .Net используется в COM-приложении.
На самом деле мы активно использовали это при переходе от приложения VB6 к полноценному приложению .Net:мы смогли повторно использовать функциональность .Net (доступ к базе данных) в устаревшем приложении VB6, но нам пришлось использовать интерфейс IDispose, чтобы гарантировать правильную очистку таких вещей, как соединения с базой данных, когда мы закончили использовать объект.