Entlib и interop: работает ли он и куда девается файл конфигурации?

Я пытаюсь использовать 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 \.

Благодарность!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
2 375
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Как включить компоненты COM на опубликованный сайт .Net?

спасибо, но у меня нет проблем с созданием COM-объекта, проблема в том, что EntLib использует файл конфигурации exe для информации о конфигурации. У меня есть COM-объект, и я хочу использовать EntLib Logging, но я не знаю, какой exe будет вызывать COM-объект, поэтому хочу указать местоположение diff для файла конфигурации.

Rory 11.12.2008 16:59
Ответ принят как подходящий

Ответ заключается в том, что 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}&#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, он должен отобразить окно сообщения с текстом «вызывается из com с помощью vbs» и записать запись в журнал событий приложения. Это демонстрирует, что пока выполняется процесс C: \ WINDOWS \ System32 \ WScript.exe (или аналогичный), он получает конфигурацию из файла конфигурации вашей dll.

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

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

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

Другие вопросы по теме