我有一个C#类库。 Framework .NET 4.5.2。我已经安装了这些NuGet包:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="AWSSDK.Core" version="3.3.21.19" targetFramework="net452" />
<package id="AWSSDK.S3" version="3.3.18" targetFramework="net452" />
<package id="log4net" version="2.0.8" targetFramework="net452" />
<package id="NUnit" version="3.10.1" targetFramework="net452" />
</packages>
这是我的代码:
using Amazon.S3;
using log4net;
using NUnit.Framework;
class Sandbox
{
[Test]
public void s()
{
LogicalThreadContext.Properties["a"] = "b";
AmazonS3Client client = new AmazonS3Client("a", "b");
}
}
以下是我通过Test Explorer运行测试时遇到的异常:
Result StackTrace:
at Amazon.AWSConfigs.get_LoggingConfig()
at Amazon.Runtime.ClientConfig..ctor()
at Amazon.S3.AmazonS3Config..ctor()
at Amazon.S3.AmazonS3Client..ctor(String awsAccessKeyId, String awsSecretAccessKey)
at ICS.Logging.AwsVerboseLogs.Tests.Sandbox.s() in C:\Dev\RFSAutomation\Utils\ICS.Logging\ICS.Logging.AwsVerboseLogs.Tests\Sandbox.cs:line 18
--SerializationException
at System.AppDomain.GetHostEvidence(Type type)
at System.Security.Policy.AppDomainEvidenceFactory.GenerateEvidence(Type evidenceType)
at System.Security.Policy.Evidence.GenerateHostEvidence(Type type, Boolean hostCanGenerate)
at System.Security.Policy.Evidence.GetHostEvidenceNoLock(Type type)
at System.Security.Policy.Evidence.RawEvidenceEnumerator.MoveNext()
at System.Security.Policy.Evidence.EvidenceEnumerator.MoveNext()
at System.Configuration.ClientConfigPaths.GetEvidenceInfo(AppDomain appDomain, String exePath, String& typeName)
at System.Configuration.ClientConfigPaths.GetTypeAndHashSuffix(AppDomain appDomain, String exePath)
at System.Configuration.ClientConfigPaths..ctor(String exePath, Boolean includeUserConfig)
at System.Configuration.ClientConfigPaths.GetPaths(String exePath, Boolean includeUserConfig)
at System.Configuration.ClientConfigurationHost.RequireCompleteInit(IInternalConfigRecord record)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSection(String configKey)
at System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection(String sectionName)
at System.Configuration.ConfigurationManager.GetSection(String sectionName)
at Amazon.AWSConfigs.GetSection[T](String sectionName)
at Amazon.Util.Internal.RootConfig..ctor()
at Amazon.AWSConfigs..cctor()
Result Message:
System.TypeInitializationException : The type initializer for 'Amazon.AWSConfigs' threw an exception.
----> System.Runtime.Serialization.SerializationException : Type is not resolved for member 'log4net.Util.PropertiesDictionary,log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a'.
如果我使用控制台应用程序做同样的事情,我不会得到例外。如果我注释掉第一行或第二行,我就不会得到例外;两条线都是必需的。
所以这个异常似乎需要NUnit,AWSSDK和log4net。
我试过谷歌搜索,但没有一个建议有效。
答案 0 :(得分:1)
要解决此问题,我按this answer添加了CallContext.FreeNamedDataSlot("log4net.Util.LogicalThreadContextProperties");
。
此测试通过:
using Amazon.S3;
using log4net;
using NUnit.Framework;
using System.Runtime.Remoting.Messaging;
class Sandbox
{
[Test]
public void s()
{
LogicalThreadContext.Properties["a"] = "b";
CallContext.FreeNamedDataSlot("log4net.Util.LogicalThreadContextProperties");
AmazonS3Client client = new AmazonS3Client("a", "b");
}
}