Donnerstag, 16. Oktober 2008

Embedded Ressources und ein bisschen mehr

Dieser Blog entsteht aus einer Handvoll Diskussionen mit BBo über ein paar Tage hinweg. Irgendwie hab ich alle Punkte in ein Beispiel reingestopft bekommen :)

Die Ursprungsfrage drehte sich darum, wie greift man auf eine eingebettete Ressource zur Laufzeit in meiner Assembly zu. Später kamen noch so Sinnesfragen hinzu wozu einen statischen Konstruktor, oder wie stell ich einfach fest ob die Konfiguration von log4net geklappt hat oder nicht,usw.

Zur "embedded resource", als erstes hab ich eine XML angelegt, die einzig die Configurations Daten für Log4Net enthält. Ganz wichtig: unter Properties ist unter Build Action embedded resource auszuwählen, sonst finden wir das nachher nicht:

Der Zugriff selber dann ist in Zeile 29 vom Code zu sehen. Beim auslesen der Ressource erhält man einen ganz normalen Stream, der kann dann wie gewohnt verarbeitet werden, log4net erlaubt uns eine Konfiguration direkt mit dem Stream. In Zeile 24 ist übrigens die Abfrage, ob Log4Net konfiguriert wurde, zu sehen.

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Text;
   4:  using System.Xml;
   5:  using System.IO;
   6:   
   7:  using Threading = System.Threading;
   8:  using Reflection = System.Reflection;
   9:  using L4N = log4net;
  10:   
  11:  namespace StaticLogWrapper
  12:  {
  13:      [Serializable]
  14:      public class Log
  15:      {
  16:          private static readonly L4N.ILog log = L4N.LogManager.GetLogger(typeof(Log));
  17:   
  18:          static Log()
  19:          {
  20:              // try configure the standard way
  21:              L4N.Config.XmlConfigurator.Configure();
  22:   
  23:              // is log4net configured? 
  24:              if (L4N.LogManager.GetRepository().Configured)
  25:                  return; // we are finished
  26:   
  27:              // when not set log4net config from internal setup
  28:              string name = "StaticLogWrapper.Log4NetConfig.xml";
  29:              Stream objStream = Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(name);
  30:              L4N.Config.XmlConfigurator.Configure(objStream);
  31:              objStream.Close();
  32:          }
  33:          
  34:          ...

Keine Kommentare: