2009-03-15 12 views
6

Ich war gespannt, wie die folgende Zeile funktioniert log4net in einer Baugruppe für die Konfiguration:log4net-Konfiguration mit [assembly:]

[assembly: log4net.Config.XmlConfigurator(Watch=true)] 

Ich vermute, dies irgendwann aufgerufen wird, bevor die Laufzeit „main()“ aufruft, aber Wann tritt dies ein, und was sind die Folgen? Gibt es andere Frameworks/Bibliotheken, die dieses Assembly-Attribut verwenden, um einen initialen Kontext wie diesen zu laden? Gibt es irgendwelche Vorteile/Nachteile, wenn man so etwas macht, anstatt eine "Configure" -Methode in main() aufzurufen?

Antwort

7

Die Vorteile, dies zu tun sind, dass der Code vor Ihrem Haupt-Code und im Vorfeld der statischen Initialisierung initialisiert wird. Diese

bedeutet, dass Sie zum Beispiel log4net Protokollierung in einem statisch-Konstruktor verwenden. Ohne eine Möglichkeit zur Vorinitialisierung von log4net können Sie im statischen Konstruktor nie sicher sein, dass der Code korrekt initialisiert wurde.

Dieser Bereich scheint nicht sehr gut dokumentiert werden (oder einfach irgendwie zu finden), aber ich nehme an, dass die Initialisierung der genannten Methoden bei Assembly-Ladezeit durchgeführt wird.

+1

Diese Funktion wird in dem log4net-Handbuch dokumentiert, http://logging.apache.org/log4net/release/manual/configuration.html, „Konfigurationsattribut“ Abschnitt. – Designpattern

0

"Ich nehme an, das wird irgendwann aufgerufen, bevor die Laufzeit" main() "aufruft, aber wann tritt dies auf, und was sind die Auswirkungen?"


Wie pro log4net documentation:

Attribute verwendet, kann eine deutlichere Methode zum Definieren, wo die Konfiguration des Anwendung wird aus geladen werden. Allerdings ist es wert darauf hingewiesen, dass Attribute sind rein passive. Sie sind nur Informationen . Wenn Sie Konfigurationsattribute verwenden, müssen Sie daher log4net aufrufen, damit die Attribute gelesen werden können.

Also ich denke, Sie müssen immer noch entweder XmlConfigurator.Configure() Methode oder aufrufen.