[英]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.3 , LogicalThreadContext使用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.