Warum hat IDisposable das Attribut [ComVisible(true)]?
-
21-12-2019 - |
Frage
Ich habe eine große ältere ASP.NET-Anwendung geerbt, in der ich arbeite, und unser Unternehmen möchte, dass wir FxCop verwenden und alle größeren Regelverstöße beheben.Derzeit scheint folgende Regel vorherrschend zu sein:
CA1405:Basistypen des sichtbaren COM-Typs sollten COM-sichtbar sein
Es scheint, dass jede ASP.NET-Seite/jedes ASP.NET-Steuerelement in unserer Anwendung gegen diese Regel verstößt.Ich war mir zunächst nicht sicher, warum, aber schließlich wurde mir klar, dass es an der folgenden Vererbungskette liegt:
System.IDisposable → System.Web.UI.Control → System.Web.UI.TemplateControl → System.Web.UI.Page
Ich habe es auch gemerkt IDisposable
ist definiert als:
[ComVisible(true)]
public interface IDisposable
{
void Dispose();
}
Zusammenfassen:Alle ASP.NET-Seiten/Steuerelemente erben von IDisposable
, Und IDisposable
hat die [ComVisible(true)]
Attribut, was bedeutet, dass alle Seiten/Steuerelemente diese Regel nicht erfüllen.
Das tut uns weh, denn unsere Anwendung hat Tausende von Seiten und Kontrollen und damit Tausende von Verstößen.Das Deaktivieren der Regel ist keine Option, da wir über einen „Firmenstandard“-Satz von FxCop-Regeln verfügen.Es scheint, dass FxCop möchte, dass wir dieses Attribut durchgehen und auf jeder einzelnen Seite unserer Anwendung einfügen, woran ich wirklich kein Interesse habe.
Meine Frage ist, warum IDisposable
habe den [ComVisible(true)]
Attribut überhaupt?
Lösung
IDisposable ist als COMVisible markiert, um die Entsorgung von Ressourcen zu ermöglichen, wenn eine .Net-Komponente in einer COM-Anwendung verwendet wird.
Wir haben dies tatsächlich häufig beim Übergang von einer VB6-Anwendung zu einer vollständigen .Net-Anwendung genutzt:Wir konnten die .NET-Funktionalität (Datenbankzugriff) in einer älteren VB6-Anwendung wiederverwenden, mussten jedoch die IDispose-Schnittstelle verwenden, um sicherzustellen, dass Dinge wie Datenbankverbindungen korrekt bereinigt wurden, wenn wir mit der Verwendung des Objekts fertig waren.