简体   繁体   English

使用城堡测井功能将Castle Windsor 4.0.0版和NLog结合起来

[英]Combining Castle Windsor version 4.0.0 and NLog using Castle Logging Facility

I am attempting to set up a new console application using Castle Windsor. 我正在尝试使用Castle Windsor设置新的控制台应用程序。 I want to incorporate NLog into the application. 我想将NLog合并到应用程序中。 However, whenever I try to run the application I get the following error when trying to add an NLog facility to the Windsor container. 但是,每当我尝试运行该应用程序时,尝试将NLog工具添加到Windsor容器时都会收到以下错误。

The error I'm getting is: 我得到的错误是:

Castle.MicroKernel.SubSystems.Conversion.ConverterException: Could not convert string 'Castle.Services.Logging.NLogIntegration.NLogFactory,Castle.Services.Logging.NLogIntegration,Version=4.0.0.0, Culture=neutral,PublicKeyToken=407dd0808d44fbdc' to a type. ---> System.IO.FileLoadException: Could not load file or assembly 'Castle.Services.Logging.NLogIntegration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
   at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMarkHandle stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName, ObjectHandleOnStack type)
   at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName)
   at System.RuntimeType.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark)
   at System.Type.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase)
   at Castle.MicroKernel.SubSystems.Conversion.TypeNameConverter.GetType(String name)
   at Castle.MicroKernel.SubSystems.Conversion.TypeNameConverter.PerformConversion(String value, Type targetType)
   --- End of inner exception stack trace ---
   at Castle.MicroKernel.SubSystems.Conversion.TypeNameConverter.PerformConversion(String value, Type targetType)
   at Castle.MicroKernel.SubSystems.Conversion.DefaultConversionManager.PerformConversion(String value, Type targetType)
   at Castle.MicroKernel.SubSystems.Conversion.DefaultConversionManager.PerformConversion[TTarget](String value)
   at Castle.Facilities.Logging.LoggingFacility.GetLoggingFactoryType(LoggerImplementation loggerApi)
   at Castle.Facilities.Logging.LoggingFacility.CreateProperLoggerFactory(LoggerImplementation loggerApi)
   at Castle.Facilities.Logging.LoggingFacility.Init()
   at Castle.MicroKernel.Facilities.AbstractFacility.Castle.MicroKernel.IFacility.Init(IKernel kernel, IConfiguration facilityConfig)
   at Castle.MicroKernel.DefaultKernel.AddFacility(String key, IFacility facility)
   at Castle.MicroKernel.DefaultKernel.AddFacility(IFacility facility)
   at Castle.MicroKernel.DefaultKernel.AddFacility[T](Action`1 onCreate)
   at Castle.Windsor.WindsorContainer.AddFacility[T](Action`1 onCreate)
   at CastleWindsorNLogIntegration.MyWindsorInstaller.Install(IWindsorContainer container, IConfigurationStore store) in c:\users\mchaleg\documents\visual studio 2015\Projects\CastleWindsorNLogIntegration\CastleWindsorNLogIntegration\Program.cs:line 41
   at Castle.Windsor.WindsorContainer.Install(IWindsorInstaller[] installers, DefaultComponentInstaller scope)
   at Castle.Windsor.WindsorContainer.Install(IWindsorInstaller[] installers)
   at CastleWindsorNLogIntegration.Program.Main(String[] args) in c:\users\mchaleg\documents\visual studio 2015\Projects\CastleWindsorNLogIntegration\CastleWindsorNLogIntegration\Program.cs:line 17

which occurs when I try to the new logging facility to the Windsor container. 当我尝试将新的日志记录功能添加到Windsor容器时发生。 The code that triggers the exception is shown here in the code snippet below. 下面的代码段中显示了触发异常的代码。 The error occurs in the class MyWindsorInstaller . 该错误发生在类MyWindsorInstaller

namespace CastleWindsorNLogIntegration
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                var container = new WindsorContainer().Install(new MyWindsorInstaller());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }
    }


    internal class MyWindsorInstaller : IWindsorInstaller
    {
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            // The error occurs when running this line
            container.AddFacility<LoggingFacility>(f => f.LogUsing(LoggerImplementation.NLog)
                                                            .WithConfig("NLog.config"));

            container.Register(
                Component.For<IObjectGraphRoot>().ImplementedBy<ObjectGraphRoot>());
        }
    }


    internal interface IObjectGraphRoot
    {
        void Log();
    }


    internal class ObjectGraphRoot : IObjectGraphRoot
    {
        private ILogger _logger = NullLogger.Instance;

        public ILogger Logger
        {
            get { return _logger; }
            set { _logger = value; }
        }

        public void Log()
        {
            _logger.Info("Log something");
        }
    }
}

From what I can tell I have installed all the correct packages using NuGet. 据我所知,我已经使用NuGet安装了所有正确的软件包。 You can see the list of installed packages below. 您可以在下面看到已安装软件包的列表。 I've checked the dependencies for each package and everything seems to be correct. 我检查了每个程序包的依赖关系,一切似乎都是正确的。 Can anyone explain what I'm doing wrong? 谁能解释我在做什么错?

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Castle.Core" version="4.1.1" targetFramework="net452" />
  <package id="Castle.Core-NLog" version="4.1.1" targetFramework="net452" />
  <package id="Castle.LoggingFacility" version="4.0.0" targetFramework="net452" />
  <package id="Castle.Windsor" version="4.0.0" targetFramework="net452" />
  <package id="NLog" version="4.4.12" targetFramework="net452" />
  <package id="NLog.Config" version="4.4.12" targetFramework="net452" />
  <package id="NLog.Schema" version="4.4.12" targetFramework="net452" />
</packages>

The solution described below is taken from the information contained in the link https://www.bountysource.com/issues/47957245-fix-dependency-specification-of-logging-packages-to-the-exact-same-explicit-version-of-castle-core-package 以下描述的解决方案来自链接https://www.bountysource.com/issues/47957245-fix-dependency-specification-of-logging-packages-to-the-exact-same-explicit-version中包含的信息-of-城堡型芯组

When originally installing the packages for Castle Windsor and NLog (via NuGet) I ended up with the following combination of packages: 最初(通过NuGet)安装Castle Windsor和NLog的软件包时,我得到了以下软件包组合:

<package id="Castle.Core" version="4.0.0" targetFramework="net452"/>
<package id="Castle.Core-NLog" version="3.3.0" targetFramework="net452" />
<package id="Castle.LoggingFacility" version="4.0.0" targetFramework="net452"/>
<package id="Castle.Windsor" version="4.0.0" targetFramework="net452"/>    
<package id="Castle.Windsor-NLog" version="3.4.0" targetFramework="net452"/>

The problem is happening because different versions of the separate Castle-Core packages should not be used together. 发生此问题是因为不同的版本的单独Castle-Core软件包不应一起使用。

The solution was to reload the packages (again via NuGet) and specify the same version for each package, as shown in the list below. 解决方案是重新加载软件包(再次通过NuGet)并为每个软件包指定相同的版本,如下表所示。

<package id="Castle.Core" version="4.0.0" targetFramework="net452"/>
<package id="Castle.Core-NLog" version="4.0.0" targetFramework="net452" />
<package id="Castle.LoggingFacility" version="4.0.0" targetFramework="net452"/>
<package id="Castle.Windsor" version="4.0.0" targetFramework="net452"/>    

Note that Castle.Windsor-NLog is no longer required so it should not be installed. 请注意,不再需要Castle.Windsor-NLog因此不应该安装它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM