2008-12-11 2 views
1

Я пытаюсь использовать EntLib 3.1 внутри .net-кода для dll, который зарегистрирован для COM-взаимодействия. Где я могу поместить файл конфигурации?Entlib и interop: он работает, и куда идет файл конфигурации?

Альтернативно, существует ли способ указать внутри кода dll, откуда он должен получить конфигурацию entlib? Поскольку моя dll будет вызвана из COM, я не всегда знаю, что exe будет ее называть.

Я создал простое приложение, которое использует ведение журнала entlib с двумя классами: «CallingApp» и «MyComThing». Когда я вызываю метод MyComThing из CallingApp, он регистрируется с помощью конфигурации в конфигурационном файле CallingApp. Когда я вызываю метод MyComThing из сценария vbs, то есть через COM, я получаю сообщение об ошибке «Раздел конфигурации для журнала не может быть найден в источнике конфигурации». Мой файл COMThing.dll.config находится в той же папке, что и зарегистрированный файл COMThing.dll, то есть в папке bin \ debug \.

спасибо!

ответ

3

Ответ в том, что Enterprise Library по умолчанию использует конфигурационный файл ЕХЕ в. Если вы создаете dll, включая COM, то по уважительной причине вы можете не захотеть зависеть от вызывающего исполняемого файла. Одним из решений этого (может быть и других) является создание объектов Enterprise Library самостоятельно, а не использование стандартных по умолчанию, и расскажите им, где получить конфигурацию. Это не так страшно, как кажется, и не требует перекомпиляции entlib или чего-то подобного.

Вместо того, чтобы просто используя Logger.Write() я сделал следующее: а) Создание писателя журнала, используя конфигурационный файл в библиотеках DLL:

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

б) Затем используйте этот журнал писатель в коде:

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

Вот полный код для образца объекта, который я создал. Ссылки были Microsoft.Practices.EnterpriseLibrary.Common, Microsoft.Practices.EnterpriseLibrary.Logging, Microsoft.Practices.ObjectBuilder, система, 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; 
     } 
    } 

} 

Проект включил файл COMThing.dll.config, который я установил «Копировать в выходной каталог» в «Копировать всегда». Это тривиальная конфигурация, которая записывает информацию журнала в журнал событий приложений. Содержимое конфигурационного файла:

<?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> 

В свойствах проекта в разделе Проверка сборки «Зарегистрируйтесь для COM-взаимодействия». Построение проекта, а затем создайте следующий .vbs файл:

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

Если дважды щелкнуть этот VBS файл, он должен показать окно сообщения с текстом «вызываемым из ком по VBS» и сделать запись в приложении Журнал событий. Это демонстрирует, что, хотя процесс выполнения - C: \ WINDOWS \ System32 \ WScript.exe (или аналогичный), он получает конфигурацию из конфигурационного файла вашей dll.

Я основывал это на информации here в разделе «Использование нескольких источников конфигурации».

Обратите внимание, что класс Logger содержит множество хороших вспомогательных методов с разными аргументами. Поскольку мы используем класс LogWriter, мы не получаем эту магию. Лично я создам еще один класс в своей библиотеке для выполнения той же работы на основе Logger.

В приведенной статье показан тот же принцип, примененный к блокам приложений базы данных и исключений. Предположительно одна и та же модель может быть применена к большинству/всем из них.

0

Проверьте относящуюся к делу проблему, с которой я столкнулся. Может быть, это поможет.

How to include COM components on a published .Net site?

+0

спасибо, но у меня нет проблем с созданием COM obj, проблема заключается в том, что EntLib использует конфигурационный файл exe для информации о конфигурации. У меня есть COM-объект и вы хотите использовать Logging EntLib, но я не знаю, что exe будет вызывать COM-объект, поэтому вы хотите указать местоположение diff для файла конфигурации. – Rory 2008-12-11 13:59:28