Question

Je suis en train d'utiliser le EntLib 3.1 dans le code .net pour une dll qui est enregistré pour COM Interop. Où dois-je placer le fichier de configuration?

Sinon, est-il un moyen de spécifier dans le code dll où il doit obtenir la configuration de EntLib? Depuis mon dll est appelé par COM Je ne sais pas toujours ce que exe sera l'appeler.

J'ai créé une application simple qui utilise Logging EntLib, avec deux classes: 'CallingApp' et 'MyComThing'. Quand j'appelle une méthode de MyComThing de CallingApp il enregistre en utilisant la configuration dans le fichier de configuration de CallingApp. Quand j'appelle la méthode de MyComThing à partir d'un script VBS, soit par COM, je reçois une erreur « La section de configuration pour l'exploitation forestière ne peut être trouvée dans la source de configuration ». Mon fichier COMThing.dll.config est dans le même dossier que le COMThing.dll enregistré, à savoir dans le bin \ debug dossier \.

merci!

Était-ce utile?

La solution

La réponse est que Enterprise Library utilise par défaut le fichier de configuration de l'exe. Si vous produisez une dll, y compris COM, puis pour une bonne raison, vous voudrez peut-être pas dépendre de l'exécutable d'appel. Une solution à ce (il pourrait y avoir d'autres) est de créer la bibliothèque Enterprise vous des objets au lieu d'utiliser ceux par défaut, et leur dire où obtenir la configuration à partir. Ce n'est pas aussi effrayant car il semble et ne nécessite pas recompiler EntLib ou quelque chose comme ça.

Au lieu de simplement à l'aide Logger.Write () Je l'ai fait ce qui suit: a) Créer l'auteur du journal, en utilisant le fichier de configuration du dll:

        string dllConfigFilename = Assembly.GetExecutingAssembly().Location + ".config";
        FileConfigurationSource exceptionsSource = new FileConfigurationSource(dllConfigFilename);
        LogWriterFactory writerFactory = new LogWriterFactory(exceptionsSource);
        logWriter = writerFactory.Create();

b) Ensuite, utilisez cet écrivain de journal dans votre code:

        LogEntry log = new LogEntry();
        log.Message = message;
        log.Categories = new string[] { "General" };
        logWriter.Write(log);

Voici le code complet pour un objet échantillon que j'ai créé. Les références ont été Microsoft.Practices.EnterpriseLibrary.Common, Microsoft.Practices.EnterpriseLibrary.Logging, Microsoft.Practices.ObjectBuilder, Système, System.Data, System.Windows.Forms, System.XML:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Reflection;
using System.IO;
using Microsoft.Practices.EnterpriseLibrary.Logging;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;

namespace COMThing
{
    [ComVisible(true)]
    public class MyComThing : MyComInterface
    {
        LogWriter logWriter; 

        public MyComThing()
        {
            string dllConfigFilename = Assembly.GetExecutingAssembly().Location + ".config";
            FileConfigurationSource exceptionsSource = new FileConfigurationSource(dllConfigFilename);
            LogWriterFactory writerFactory = new LogWriterFactory(exceptionsSource);
            logWriter = writerFactory.Create();
        }

        public bool ProcessMessage(string message)
        {
            LogEntry log = new LogEntry();
            log.Message = message;
            log.Categories = new string[] { "General" };
            logWriter.Write(log);
            MessageBox.Show(message);
            return true;
        }
    }

}

Le projet comprenait un fichier COMThing.dll.config que je mets « Copie vers le répertoire de sortie » à « Copie toujours ». Ceci est une config trivial qui écrit les informations du journal à l'application du journal des événements. Le contenu du fichier de configuration sont:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </configSections>
  <loggingConfiguration name="Logging Application Block" tracingEnabled="true"
    defaultCategory="General" logWarningsWhenNoCategoriesMatch="true">
    <listeners>
      <add source="COMThing Logger" formatter="Text Formatter" log="Application"
        machineName="" listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.FormattedEventLogTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
        traceOutputOptions="None" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.FormattedEventLogTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
        name="Formatted EventLog TraceListener" />
    </listeners>
    <formatters>
      <add template="Timestamp: {timestamp}&#xD;&#xA;Message: {message}&#xD;&#xA;Category: {category}&#xD;&#xA;Priority: {priority}&#xD;&#xA;EventId: {eventid}&#xD;&#xA;Severity: {severity}&#xD;&#xA;Title:{title}&#xD;&#xA;Machine: {machine}&#xD;&#xA;Application Domain: {appDomain}&#xD;&#xA;Process Id: {processId}&#xD;&#xA;Process Name: {processName}&#xD;&#xA;Win32 Thread Id: {win32ThreadId}&#xD;&#xA;Thread Name: {threadName}&#xD;&#xA;Extended Properties: {dictionary({key} - {value}&#xD;&#xA;)}"
        type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
        name="Text Formatter" />
    </formatters>
    <categorySources>
      <add switchValue="All" name="General">
        <listeners>
          <add name="Formatted EventLog TraceListener" />
        </listeners>
      </add>
    </categorySources>
    <specialSources>
      <allEvents switchValue="All" name="All Events">
        <listeners>
          <add name="Formatted EventLog TraceListener" />
        </listeners>
      </allEvents>
      <notProcessed switchValue="All" name="Unprocessed Category" />
      <errors switchValue="All" name="Logging Errors &amp; Warnings">
        <listeners>
          <add name="Formatted EventLog TraceListener" />
        </listeners>
      </errors>
    </specialSources>
  </loggingConfiguration>
</configuration>

Dans les propriétés du projet sous contrôle Build 'Inscrivez-vous pour COM Interop. Générez le projet, puis créez le fichier .vbs suivant:

Set obj = CreateObject("COMThing.MyComThing")
obj.ProcessMessage("called from com by vbs")

Si vous double-cliquez sur ce fichier vbs devrait afficher une boîte de message avec le texte « appelé de com par vbs » et écrire une entrée dans votre journal des événements. Cela démontre que si le processus d'exécution est C:. \ WINDOWS \ System32 \ WScript.exe (ou similaire), il se fait de la configuration depuis le fichier de configuration de votre dll

Je me suis basé sur les informations sous la rubrique « Utilisation de plusieurs ConfigurationSources ».

Notez que la classe Logger comprend beaucoup de méthodes agréables d'aide avec des arguments différents. Comme nous utilisons la classe LogWriter nous ne recevons pas cette magie. Personnellement, je vais créer une autre classe au sein de ma bibliothèque pour effectuer le même travail, sur la base Logger.

L'article référencé montre le même principe appliqué à des blocs de base de données et d'application d'exception. On peut supposer que le même modèle peut être appliqué à la plupart / tous.

Autres conseils

Vérifier la question relative que je l'avais fait face. Peut-être son de l'aide.

Comment inclure des composants COM sur une publication. Site net

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top