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





Проверьте соответствующую проблему, с которой я столкнулся. Может быть, это поможет.
Как включить компоненты COM на опубликованный сайт .Net?
Ответ заключается в том, что Enterprise Library по умолчанию использует файл конфигурации exe. Если вы создаете dll, включая COM, то по уважительной причине вы, возможно, не захотите зависеть от вызывающего исполняемого файла. Одно из решений этой проблемы (могут быть и другие) - создать объекты Enterprise Library самостоятельно, а не использовать объекты по умолчанию, и сообщить им, откуда взять конфигурацию. Это не так страшно, как кажется, и не требует перекомпиляции entlib или чего-то подобного.
Вместо простого использования Logger.Write () я сделал следующее: a) Создайте средство записи журнала, используя файл конфигурации 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, 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}
Message: {message}
Category: {category}
Priority: {priority}
EventId: {eventid}
Severity: {severity}
Title:{title}
Machine: {machine}
Application Domain: {appDomain}
Process Id: {processId}
Process Name: {processName}
Win32 Thread Id: {win32ThreadId}
Thread Name: {threadName}
Extended Properties: {dictionary({key} - {value}
)}"
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 & 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, он должен отобразить окно сообщения с текстом «вызывается из com с помощью vbs» и записать запись в журнал событий приложения. Это демонстрирует, что пока выполняется процесс C: \ WINDOWS \ System32 \ WScript.exe (или аналогичный), он получает конфигурацию из файла конфигурации вашей dll.
Я основывал это на информации здесь в разделе «Использование нескольких источников конфигурации».
Обратите внимание, что класс Logger включает множество хороших вспомогательных методов с разными аргументами. Поскольку мы используем класс LogWriter, мы не получаем этого волшебства. Лично я буду создавать другой класс в своей библиотеке для выполнения той же работы на основе Logger.
В указанной статье показан тот же принцип, применяемый к блокам приложений Database и Exception. Предположительно одна и та же модель может быть применена к большинству / всем из них.
спасибо, но у меня нет проблем с созданием COM-объекта, проблема в том, что EntLib использует файл конфигурации exe для информации о конфигурации. У меня есть COM-объект, и я хочу использовать EntLib Logging, но я не знаю, какой exe будет вызывать COM-объект, поэтому хочу указать местоположение diff для файла конфигурации.