Por que IDisposable possui o atributo [ComVisible(true)]?
-
21-12-2019 - |
Pergunta
Herdei um grande aplicativo ASP.NET legado onde trabalho e nossa empresa deseja que usemos o FxCop e corrijamos todas as principais violações de regras.Atualmente, uma regra que parece prevalecer é a seguinte:
CA1405:Os tipos base de tipo visível COM devem ser visíveis COM
Parece que todas as páginas/controles ASP.NET em nosso aplicativo estão violando esta regra.Eu não tinha certeza do porquê no começo, mas finalmente percebi que isso se devia à seguinte cadeia de herança:
System.IDisposable → System.Web.UI.Control → System.Web.UI.TemplateControl → System.Web.UI.Page
Eu também percebi IDisposable
é definido como:
[ComVisible(true)]
public interface IDisposable
{
void Dispose();
}
Para resumir:todas as páginas/controles ASP.NET herdam de IDisposable
, e IDisposable
tem o [ComVisible(true)]
atributo, o que significa que todas as páginas/controles falharão nesta regra.
Isso está nos prejudicando porque nosso aplicativo possui milhares de páginas e controles e, portanto, milhares de violações.Desativar a regra não é uma opção, pois temos um conjunto de regras FxCop “padrão da empresa”.Parece que o FxCop quer que coloquemos esse atributo em cada página do nosso aplicativo, o que realmente não estou interessado em fazer.
Minha pergunta é: por que IDisposable
tenha o [ComVisible(true)]
atributo em primeiro lugar?
Solução
IDisposable é marcado como COMVisible para permitir o descarte de recursos quando um componente .Net é usado em um aplicativo COM.
Na verdade, usamos muito isso ao fazer a transição de um aplicativo VB6 para um aplicativo .Net completo:conseguimos reutilizar a funcionalidade .Net (acesso ao banco de dados) em um aplicativo VB6 herdado, mas tivemos que usar a interface IDispose para garantir que coisas como conexões de banco de dados fossem limpas corretamente quando terminamos de usar o objeto.