I have a C# class library. Framework .NET 4.5.2. I've installed these NuGet packages:
<?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>
Here is my code:
using Amazon.S3;
using log4net;
using NUnit.Framework;
class Sandbox
{
[Test]
public void s()
{
LogicalThreadContext.Properties["a"] = "b";
AmazonS3Client client = new AmazonS3Client("a", "b");
}
}
Here's the exception I am getting when I run the test through 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'.
If I do the same thing with a console app, I don't get the exception. If I comment out the first or the second line I don't get the exception; both lines are needed.
So this exception seems to require NUnit, AWSSDK and log4net.
I've tried googling, but none of the suggestions worked.
To solve the issue I added CallContext.FreeNamedDataSlot("log4net.Util.LogicalThreadContextProperties");
per this answer.
This test passes:
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");
}
}