Entlib وإمكانية التشغيل المتداخل: يعمل، وأين تذهب ملف التكوين؟

StackOverflow https://stackoverflow.com/questions/359354

سؤال

وأنا أحاول أن استخدام EntLib 3.1 ضمن التعليمات البرمجية الصافية ل DLL التي تم تسجيلها عن إمكانية التشغيل المتداخل COM. أين أضع ملف التكوين؟

وبدلا من ذلك، هل هناك طريقة لتحديد ضمن رمز دلل حيث يجب ان تحصل على التكوين entlib من؟ منذ سوف يطلق بلدي دلل من COM لا أعرف دائما ما إكس سيتم يدعو ذلك.

وأنا خلقت التطبيق البسيط الذي يستخدم entlib تسجيل، مع فئتين: "CallingApp" و "MyComThing. عندما أسميه أسلوب MyComThing من CallingApp ذلك بتسجيل باستخدام التكوين في ملف التكوين CallingApp ل. عندما كنت استدعاء الأسلوب من MyComThing من السيناريو فبس، أي من خلال COM، أحصل على خطأ "لا يمكن العثور على مقطع التكوين للتسجيل في مصدر التكوين". ملف COMThing.dll.config بلدي في نفس المجلد مثل COMThing.dll مسجل، أي في سلة المهملات \ تصحيح \ المجلد.

وذلك بفضل!

هل كانت مفيدة؟

المحلول

والجواب هو أن مكتبة المؤسسة افتراضيا يستخدم ملف التكوين إكس ل. إذا كنت تنتج دلل، بما في ذلك COM، ثم لسبب وجيه قد لا تريد أن تعتمد على تنفيذ الاستدعاء. حل واحد لهذا (قد يكون هناك غيرها) هو خلق مكتبة المؤسسة كائنات نفسك بدلا من استخدام تلك الافتراضية، ونقول لهم أين يمكن الحصول على التكوين من. هذه ليست مخيفة كما يبدو ولا يتطلب اعادة تجميع 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")

إذا كنت انقر نقرا مزدوجا فوق ملف هذا فبس يجب إظهار مربع رسالة مع النص "استدعاؤها من قبل كوم فبس" وكتابة إدخال إلى التطبيق الخاص بك سجل الأحداث. وهذا يدل على أنه في حين أن عملية التنفيذ هي C: \ WINDOWS \ SYSTEM32 \ WScript.exe (أو ما شابه)، هو الحصول على التكوين من ملف التكوين دلل الخاص بك

وأنا يستند هذا على المعلومات هنا تحت عنوان "عن طريق العديد ConfigurationSources.

ملاحظة أن الطبقة المسجل تتضمن الكثير من أساليب المساعد لطيفة مع حجج مختلفة. منذ نستخدمه الطبقة LogWriter لم نحصل على هذا السحر. شخصيا سأكون خلق فئة أخرى في مكتبتي لأداء نفس العمل، استنادا إلى المسجل.

وتبين المادة المشار إليها نفس المبدأ ينطبق على كتل قاعدة البيانات وتطبيق استثناء. يفترض أن نفس النموذج يمكن تطبيقه على معظم / كل منهم.

نصائح أخرى

والتحقق من القضية ذات الصلة والتي كنت قد واجه. ربما في بعض المساعدة.

كيفية تضمين مكونات COM على نشرها. صافي الموقع؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top