簡體   English   中英

配置系統初始化失敗:未解析成員 'log.net.Util.PropertiesDictionary,log.net, Version=2.0.13.0 的類型

[英]Configuration system failed to initialize: Type is not resolved for member 'log4net.Util.PropertiesDictionary,log4net, Version=2.0.13.0

編輯 2

log.net 配置:

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
.
.
.
  </configSections>

  <log4net>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file type="log4net.Util.PatternString" value="C:\Logs\somepath...\SPtoSFDC\" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <datePattern value="yyyy-MM-dd'.log'" />
      <maximumFileSize value="1024MB" />
      <maxSizeRollBackups value="50" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <staticLogFileName value="false" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="[%date{HH:mm:ss}] - %-5p - %c - %m%n" />
      </layout>
    </appender>
    <root>
      <level value="ALL" />
      <appender-ref ref="RollingFileAppender" />
    </root>
  </log4net>

編輯 1
回復下方評論:

完整的錯誤堆棧:

System.Configuration.ConfigurationErrorsException
  HResult=0x80131902
  Message=Configuration system failed to initialize
  Source=System.Configuration
  StackTrace:
   at System.Configuration.ConfigurationManager.PrepareConfigSystem()
   at System.Configuration.ConfigurationManager.GetSection(String sectionName)
   at System.Xml.Serialization.TempAssembly.get_UseLegacySerializerGeneration()
   at System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, String location, Evidence evidence)
   at System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping, Type type, String defaultNamespace)
   at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace)
   at System.Xml.Serialization.XmlSerializer..ctor(Type type)
   at Core.Base.XmlSerializerHelper.Serialize[T](T data) in D:\projects\SO.Job.SPtoSFDC\Core.Base\XmlSerializerHelper.cs:line 17
   at SPtoSFDC.UnitTests.When_sp_api.Should_xmlserialize() in D:\projects\SO.Job.SPtoSFDC\SPtoSFDC.UnitTests\When_sp_api.cs:line 38

  This exception was originally thrown at this call stack:
    [External Code]

Inner Exception 1:
SerializationException: Type is not resolved for member 'log4net.Util.PropertiesDictionary,log4net, Version=2.0.13.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a'.

我還將代碼移到新的 class 中:

    public class XmlSerializerHelper : IXmlSerializerHelper
    {
        public string Serialize<T>(T data)
        {
            var ns = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });

            CallContext.FreeNamedDataSlot("log4net.Util.LogicalThreadContextProperties");

            var serializer = new XmlSerializer(typeof(T));

            serializer.UnknownNode += new XmlNodeEventHandler(serializer_UnknownNode);
            serializer.UnknownAttribute += new XmlAttributeEventHandler(serializer_UnknownAttribute);
            serializer.UnknownElement += new XmlElementEventHandler(serializer_UnknownElement);

            var writerSettings = new XmlWriterSettings
            {
                Indent = true,
                OmitXmlDeclaration = true
            };

            using (var streamWriter = new StringWriter())
            using (var xmlWriter = XmlWriter.Create(streamWriter, writerSettings))
            {
                serializer.Serialize(xmlWriter, data, ns);
                return streamWriter.ToString();
            }
        }

        private static void serializer_UnknownAttribute(object sender, XmlAttributeEventArgs e)
        {
            throw new System.NotImplementedException();
        }

        private static void serializer_UnknownNode(object sender, XmlNodeEventArgs e)
        {
            throw new System.NotImplementedException();
        }

        private static void serializer_UnknownElement(object sender, XmlElementEventArgs e)
        {
            throw new System.NotImplementedException();
        }
    }

錯誤仍然存在。
我已經嘗試降低 log.net 的版本但沒有用。

我一直在四處尋找,但沒有找到任何解決方案。
這是測試代碼:

        [Fact]
        public void Should_xmlserialize()
        {
            var data = new SampleXml
            {
                EmployeeId = 123456
            };

            var ns = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });

            var serializer = new XmlSerializer(data.GetType());
            var writerSettings = new XmlWriterSettings
            {
                Indent = true,
                OmitXmlDeclaration = true
            };

            using (var streamWriter = new StringWriter())
            using (var xmlWriter = XmlWriter.Create(streamWriter, writerSettings))
            {
                serializer.Serialize(xmlWriter, data, ns);
                var g = streamWriter.ToString();
                var f = g;
            }

            Assert.True(true);
        }

以及我正在嘗試序列化的 class:

    [XmlRoot("request")]
    public class SampleXml
    {
        [XmlElement("employeeid")]
        public long EmployeeId { get; set; }

        [XmlElement("lastModifiedDate")]
        public string LastModifiedDate { get; set; }

        [XmlElement("isasofdate")]
        public bool IsAsOfDate { get; set; }
    }

在此處輸入圖像描述

log.net版本是2.0.13

TIA。

幾天前我在工作場所遇到了同樣的問題。

看起來這是從2.0.1版本開始發生的(這是 log.net 的 nuget 版本,在 apache 站點上它對應於1.2.12

有一張表明有人在測試運行期間遇到了同樣的問題。 這解釋了為什么會發生:

如果您的代碼將在您或第 3 方程序集中聲明的某些類型的 object 放入邏輯調用上下文中,例如使用 CallContext.LogicalSetData(在我們的例子中是使用 log.net LogicalThreadContext.Properties),當執行線程返回到testhost 進程的默認應用程序域,CLR 嘗試在那里加載該程序集。

在 apache 的 發行說明中列出了一個問題LOG.NET-317 ,該問題已在該版本中修復,它涉及在LogicalThreadContext的內部工作中使用CallContext 由於支持netstandard1.3LogicalThreadContext使用AsyncLocal代替,所以它可以解釋為什么 OP 在 .net-core 項目中沒有這個問題。

這是重現此問題的一個小設置:

虛擬.csproj

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net471</TargetFramework>
    </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="log4net" Version="2.0.15" />
    </ItemGroup>
</Project>

程序.cs

using log4net;
using System;

public class Program
{
    public static void Main(string[] args)
    {
        // messing with CallContext via log4net.LogicalThreadContext
        LogicalThreadContext.Properties["dummy_property"] = 42;

        // create new domain and point it to a different folder
        // so it won't get to load dll's of parent domain
        AppDomainSetup domainSetup = new AppDomainSetup();
        domainSetup.ApplicationBase = "C:\\work\\temp\\";
        AppDomain domain = AppDomain.CreateDomain("AppDomainTestName", null, domainSetup);

        // try to get all assemblies of a new domain
        // here exception will be thrown.
        domain.GetAssemblies();
    }
}

例外:

Unhandled Exception: System.Runtime.Serialization.SerializationException: Type is not resolved for member 'log4net.Util.PropertiesDictionary,log4net, Version=2.0.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a'.
   at System.AppDomain.GetAssemblies()
   at Program.Main(String[] args)

在這種情況下,在調用GetAssemblies()之前添加CallContext.FreeNamedDataSlot("log.net.Util.LogicalThreadContextProperties")可以解決問題,但這是非常簡化的示例。 要保留CallContext數據,使用CallContext.LogicalGetData \ CallContext.LogicalSetData在有問題的調用后保留記錄器配置可能很有用:

var loggerDataInCallContext = CallContext.LogicalGetData("log4net.Util.LogicalThreadContextProperties");
CallContext.FreeNamedDataSlot("log4net.Util.LogicalThreadContextProperties");
// problematic call
CallContext.LogicalSetData("log4net.Util.LogicalThreadContextProperties", loggerDataInCallContext);

希望這有助於真正為某人調查\解決此問題,另一種選擇是移至 .net-core 或將log.net依賴項放入GAC

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM