Author: bodewig
Date: Sun Mar 29 10:00:50 2015
New Revision: 1669884

URL: http://svn.apache.org/r1669884
Log:
LOG4NET-455 LogicalThreadContext does not flow correctly through async/await 
Patch by Alexander Houben

closes #12 by @ahouben

Added:
    logging/log4net/trunk/src/log4net.Tests/Context/LogicalThreadContextTest.cs 
  (with props)
    logging/log4net/trunk/src/log4net.Tests/log4net.Tests.vs2012.csproj   (with 
props)
    logging/log4net/trunk/src/log4net/Util/LogicalThreadContextStack.cs   (with 
props)
    logging/log4net/trunk/src/log4net/Util/LogicalThreadContextStacks.cs   
(with props)
    logging/log4net/trunk/src/log4net/log4net.vs2012.csproj   (with props)
    logging/log4net/trunk/src/log4net/log4net.vs2012.sln   (with props)
Modified:
    logging/log4net/trunk/src/log4net.Tests/Utils.cs
    logging/log4net/trunk/src/log4net.Tests/log4net.Tests.vs2010.csproj
    logging/log4net/trunk/src/log4net/AssemblyInfo.cs
    logging/log4net/trunk/src/log4net/LogicalThreadContext.cs
    logging/log4net/trunk/src/log4net/Util/LogicalThreadContextProperties.cs
    logging/log4net/trunk/src/log4net/log4net.vs2010.csproj

Added: 
logging/log4net/trunk/src/log4net.Tests/Context/LogicalThreadContextTest.cs
URL: 
http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net.Tests/Context/LogicalThreadContextTest.cs?rev=1669884&view=auto
==============================================================================
--- logging/log4net/trunk/src/log4net.Tests/Context/LogicalThreadContextTest.cs 
(added)
+++ logging/log4net/trunk/src/log4net.Tests/Context/LogicalThreadContextTest.cs 
Sun Mar 29 10:00:50 2015
@@ -0,0 +1,344 @@
+#region Apache License
+//
+// Licensed to the Apache Software Foundation (ASF) under one or more 
+// contributor license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership. 
+// The ASF licenses this file to you under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with 
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#endregion
+
+using System;
+using System.Threading.Tasks;
+using System.Linq;
+
+using log4net.Config;
+using log4net.Layout;
+using log4net.Repository;
+using log4net.Tests.Appender;
+using log4net.Util;
+
+using NUnit.Framework;
+
+namespace log4net.Tests.Context
+{
+#if FRAMEWORK_4_5_OR_ABOVE
+       /// <summary>
+       /// Used for internal unit testing the <see 
cref="LogicalThreadContext"/> class.
+       /// </summary>
+       /// <remarks>
+       /// Used for internal unit testing the <see 
cref="LogicalThreadContext"/> class.
+       /// </remarks>
+       [TestFixture]
+       public class LogicalThreadContextTest
+       {
+               [TearDown]
+               public void TearDown()
+               {
+                       Utils.RemovePropertyFromAllContexts();
+               }
+
+               [Test]
+               public void TestLogicalThreadPropertiesPatternBasicGetSet()
+               {
+                       StringAppender stringAppender = new StringAppender();
+                       stringAppender.Layout = new PatternLayout("%property{" 
+ Utils.PROPERTY_KEY + "}");
+
+                       ILoggerRepository rep = 
LogManager.CreateRepository(Guid.NewGuid().ToString());
+                       BasicConfigurator.Configure(rep, stringAppender);
+
+                       ILog log1 = LogManager.GetLogger(rep.Name, 
"TestLogicalThreadPropertiesPattern");
+
+                       log1.Info("TestMessage");
+                       Assert.AreEqual(SystemInfo.NullText, 
stringAppender.GetString(), "Test no logical thread properties value set");
+                       stringAppender.Reset();
+
+                       LogicalThreadContext.Properties[Utils.PROPERTY_KEY] = 
"val1";
+
+                       log1.Info("TestMessage");
+                       Assert.AreEqual("val1", stringAppender.GetString(), 
"Test logical thread properties value set");
+                       stringAppender.Reset();
+
+                       
LogicalThreadContext.Properties.Remove(Utils.PROPERTY_KEY);
+
+                       log1.Info("TestMessage");
+                       Assert.AreEqual(SystemInfo.NullText, 
stringAppender.GetString(), "Test logical thread properties value removed");
+                       stringAppender.Reset();
+               }
+
+               [Test]
+               public async Task TestLogicalThreadPropertiesPatternAsyncAwait()
+               {
+                       StringAppender stringAppender = new StringAppender();
+                       stringAppender.Layout = new PatternLayout("%property{" 
+ Utils.PROPERTY_KEY + "}");
+
+                       ILoggerRepository rep = 
LogManager.CreateRepository(Guid.NewGuid().ToString());
+                       BasicConfigurator.Configure(rep, stringAppender);
+
+                       ILog log1 = LogManager.GetLogger(rep.Name, 
"TestLogicalThreadPropertiesPattern");
+
+                       log1.Info("TestMessage");
+                       Assert.AreEqual(SystemInfo.NullText, 
stringAppender.GetString(), "Test no logical thread stack value set");
+                       stringAppender.Reset();
+
+                       string testValueForCurrentContext = "Outer";
+                       LogicalThreadContext.Properties[Utils.PROPERTY_KEY] = 
testValueForCurrentContext;
+
+                       log1.Info("TestMessage");
+                       Assert.AreEqual(testValueForCurrentContext, 
stringAppender.GetString(), "Test logical thread properties value set");
+                       stringAppender.Reset();
+
+                       var strings = await Task.WhenAll(Enumerable.Range(0, 
10).Select(x => SomeWorkProperties(x.ToString())));
+
+                       // strings should be ["00AA0BB0", "01AA1BB1", 
"02AA2BB2", ...]
+                       for (int i = 0; i < strings.Length; i++)
+                       {
+                               
Assert.AreEqual(string.Format("{0}{1}AA{1}BB{1}", testValueForCurrentContext, 
i), strings[i], "Test logical thread properties expected sequence");
+                       }
+
+                       log1.Info("TestMessage");
+                       Assert.AreEqual(testValueForCurrentContext, 
stringAppender.GetString(), "Test logical thread properties value set");
+                       stringAppender.Reset();
+
+                       
LogicalThreadContext.Properties.Remove(Utils.PROPERTY_KEY);
+
+                       log1.Info("TestMessage");
+                       Assert.AreEqual(SystemInfo.NullText, 
stringAppender.GetString(), "Test logical thread properties value removed");
+                       stringAppender.Reset();
+               }
+
+               [Test]
+               public void TestLogicalThreadStackPattern()
+               {
+                       StringAppender stringAppender = new StringAppender();
+                       stringAppender.Layout = new PatternLayout("%property{" 
+ Utils.PROPERTY_KEY + "}");
+
+                       ILoggerRepository rep = 
LogManager.CreateRepository(Guid.NewGuid().ToString());
+                       BasicConfigurator.Configure(rep, stringAppender);
+
+                       ILog log1 = LogManager.GetLogger(rep.Name, 
"TestThreadStackPattern");
+
+                       log1.Info("TestMessage");
+                       Assert.AreEqual(SystemInfo.NullText, 
stringAppender.GetString(), "Test no logical thread stack value set");
+                       stringAppender.Reset();
+
+                       using 
(LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val1"))
+                       {
+                               log1.Info("TestMessage");
+                               Assert.AreEqual("val1", 
stringAppender.GetString(), "Test logical thread stack value set");
+                               stringAppender.Reset();
+                       }
+
+                       log1.Info("TestMessage");
+                       Assert.AreEqual(SystemInfo.NullText, 
stringAppender.GetString(), "Test logical thread stack value removed");
+                       stringAppender.Reset();
+               }
+
+               [Test]
+               public void TestLogicalThreadStackPattern2()
+               {
+                       StringAppender stringAppender = new StringAppender();
+                       stringAppender.Layout = new PatternLayout("%property{" 
+ Utils.PROPERTY_KEY + "}");
+
+                       ILoggerRepository rep = 
LogManager.CreateRepository(Guid.NewGuid().ToString());
+                       BasicConfigurator.Configure(rep, stringAppender);
+
+                       ILog log1 = LogManager.GetLogger(rep.Name, 
"TestThreadStackPattern");
+
+                       log1.Info("TestMessage");
+                       Assert.AreEqual(SystemInfo.NullText, 
stringAppender.GetString(), "Test no logical thread stack value set");
+                       stringAppender.Reset();
+
+                       using 
(LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val1"))
+                       {
+                               log1.Info("TestMessage");
+                               Assert.AreEqual("val1", 
stringAppender.GetString(), "Test logical thread stack value set");
+                               stringAppender.Reset();
+
+                               using 
(LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val2"))
+                               {
+                                       log1.Info("TestMessage");
+                                       Assert.AreEqual("val1 val2", 
stringAppender.GetString(), "Test logical thread stack value pushed 2nd val");
+                                       stringAppender.Reset();
+                               }
+                       }
+
+                       log1.Info("TestMessage");
+                       Assert.AreEqual(SystemInfo.NullText, 
stringAppender.GetString(), "Test logical thread stack value removed");
+                       stringAppender.Reset();
+               }
+
+               [Test]
+               public void TestLogicalThreadStackPatternNullVal()
+               {
+                       StringAppender stringAppender = new StringAppender();
+                       stringAppender.Layout = new PatternLayout("%property{" 
+ Utils.PROPERTY_KEY + "}");
+
+                       ILoggerRepository rep = 
LogManager.CreateRepository(Guid.NewGuid().ToString());
+                       BasicConfigurator.Configure(rep, stringAppender);
+
+                       ILog log1 = LogManager.GetLogger(rep.Name, 
"TestThreadStackPattern");
+
+                       log1.Info("TestMessage");
+                       Assert.AreEqual(SystemInfo.NullText, 
stringAppender.GetString(), "Test no logical thread stack value set");
+                       stringAppender.Reset();
+
+                       using 
(LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push(null))
+                       {
+                               log1.Info("TestMessage");
+                               Assert.AreEqual(SystemInfo.NullText, 
stringAppender.GetString(), "Test logical thread stack value set");
+                               stringAppender.Reset();
+                       }
+
+                       log1.Info("TestMessage");
+                       Assert.AreEqual(SystemInfo.NullText, 
stringAppender.GetString(), "Test logical thread stack value removed");
+                       stringAppender.Reset();
+               }
+
+               [Test]
+               public void TestLogicalThreadStackPatternNullVal2()
+               {
+                       StringAppender stringAppender = new StringAppender();
+                       stringAppender.Layout = new PatternLayout("%property{" 
+ Utils.PROPERTY_KEY + "}");
+
+                       ILoggerRepository rep = 
LogManager.CreateRepository(Guid.NewGuid().ToString());
+                       BasicConfigurator.Configure(rep, stringAppender);
+
+                       ILog log1 = LogManager.GetLogger(rep.Name, 
"TestThreadStackPattern");
+
+                       log1.Info("TestMessage");
+                       Assert.AreEqual(SystemInfo.NullText, 
stringAppender.GetString(), "Test no logical thread stack value set");
+                       stringAppender.Reset();
+
+                       using 
(LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val1"))
+                       {
+                               log1.Info("TestMessage");
+                               Assert.AreEqual("val1", 
stringAppender.GetString(), "Test logical thread stack value set");
+                               stringAppender.Reset();
+
+                               using 
(LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push(null))
+                               {
+                                       log1.Info("TestMessage");
+                                       Assert.AreEqual("val1 ", 
stringAppender.GetString(), "Test logical thread stack value pushed null");
+                                       stringAppender.Reset();
+                               }
+                       }
+
+                       log1.Info("TestMessage");
+                       Assert.AreEqual(SystemInfo.NullText, 
stringAppender.GetString(), "Test logical thread stack value removed");
+                       stringAppender.Reset();
+               }
+
+               [Test]
+               public async Task TestLogicalThreadStackPatternAsyncAwait()
+               {
+                       StringAppender stringAppender = new StringAppender();
+                       stringAppender.Layout = new PatternLayout("%property{" 
+ Utils.PROPERTY_KEY + "}");
+
+                       ILoggerRepository rep = 
LogManager.CreateRepository(Guid.NewGuid().ToString());
+                       BasicConfigurator.Configure(rep, stringAppender);
+
+                       ILog log1 = LogManager.GetLogger(rep.Name, 
"TestLogicalThreadStackPattern");
+
+                       log1.Info("TestMessage");
+                       Assert.AreEqual(SystemInfo.NullText, 
stringAppender.GetString(), "Test no logical thread stack value set");
+                       stringAppender.Reset();
+
+                       string testValueForCurrentContext = "Outer";
+                       string[] strings = null;
+                       using 
(LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push(testValueForCurrentContext))
+                       {
+                               log1.Info("TestMessage");
+                               Assert.AreEqual(testValueForCurrentContext, 
stringAppender.GetString(), "Test logical thread stack value set");
+                               stringAppender.Reset();
+
+                               strings = await 
Task.WhenAll(Enumerable.Range(0, 10).Select(x => SomeWorkStack(x.ToString())));
+                       }
+
+                       // strings should be ["Outer 0 AOuter 0 AOuter 0Outer 0 
BOuter 0 B Outer 0", ...]
+                       for (int i = 0; i < strings.Length; i++)
+                       {
+                               Assert.AreEqual(string.Format("{0} {1} A{0} {1} 
A{0} {1}{0} {1} B{0} {1} B{0} {1}", testValueForCurrentContext, i), strings[i], 
"Test logical thread properties expected sequence");
+                       }
+
+                       log1.Info("TestMessage");
+                       Assert.AreEqual(SystemInfo.NullText, 
stringAppender.GetString(), "Test logical thread properties value removed");
+                       stringAppender.Reset();
+               }
+
+               static async Task<string> SomeWorkProperties(string 
propertyName)
+               {
+                       StringAppender stringAppender = new StringAppender();
+                       stringAppender.Layout = new PatternLayout("%property{" 
+ Utils.PROPERTY_KEY + "}");
+
+                       ILoggerRepository rep = 
LogManager.CreateRepository(Guid.NewGuid().ToString());
+                       BasicConfigurator.Configure(rep, stringAppender);
+
+                       ILog log = LogManager.GetLogger(rep.Name, 
"TestLogicalThreadStackPattern");
+                       log.Info("TestMessage");
+
+                       // set a new one
+                       LogicalThreadContext.Properties[Utils.PROPERTY_KEY] = 
propertyName;
+                       log.Info("TestMessage");
+
+                       await MoreWorkProperties(log, "A");
+                       log.Info("TestMessage");
+                       await MoreWorkProperties(log, "B");
+                       log.Info("TestMessage");
+                       return stringAppender.GetString();
+               }
+
+               static async Task MoreWorkProperties(ILog log, string 
propertyName)
+               {
+                       LogicalThreadContext.Properties[Utils.PROPERTY_KEY] = 
propertyName;
+                       log.Info("TestMessage");
+                       await Task.Delay(1);
+                       log.Info("TestMessage");
+               }
+
+               static async Task<string> SomeWorkStack(string stackName)
+               {
+                       StringAppender stringAppender = new StringAppender();
+                       stringAppender.Layout = new PatternLayout("%property{" 
+ Utils.PROPERTY_KEY + "}");
+
+                       ILoggerRepository rep = 
LogManager.CreateRepository(Guid.NewGuid().ToString());
+                       BasicConfigurator.Configure(rep, stringAppender);
+
+                       ILog log = LogManager.GetLogger(rep.Name, 
"TestLogicalThreadStackPattern");
+
+                       using 
(LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push(stackName))
+                       {
+                               log.Info("TestMessage");
+                               Assert.AreEqual(string.Format("Outer {0}", 
stackName), stringAppender.GetString(), "Test logical thread stack value set");
+                               stringAppender.Reset();
+
+                               await MoreWorkStack(log, "A");
+                               log.Info("TestMessage");
+                               await MoreWorkStack(log, "B");
+                               log.Info("TestMessage");
+                       }
+
+                       return stringAppender.GetString();
+               }
+
+               static async Task MoreWorkStack(ILog log, string stackName)
+               {
+                       using 
(LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push(stackName))
+                       {
+                               log.Info("TestMessage");
+                               await Task.Delay(1);
+                               log.Info("TestMessage");
+                       }
+               }
+       }
+#endif
+}
\ No newline at end of file

Propchange: 
logging/log4net/trunk/src/log4net.Tests/Context/LogicalThreadContextTest.cs
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: logging/log4net/trunk/src/log4net.Tests/Utils.cs
URL: 
http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net.Tests/Utils.cs?rev=1669884&r1=1669883&r2=1669884&view=diff
==============================================================================
--- logging/log4net/trunk/src/log4net.Tests/Utils.cs (original)
+++ logging/log4net/trunk/src/log4net.Tests/Utils.cs Sun Mar 29 10:00:50 2015
@@ -105,6 +105,7 @@ namespace log4net.Tests
         internal static void RemovePropertyFromAllContexts() {
             GlobalContext.Properties.Remove(PROPERTY_KEY);
             ThreadContext.Properties.Remove(PROPERTY_KEY);
+            LogicalThreadContext.Properties.Remove(PROPERTY_KEY);
         }
        }
 }
\ No newline at end of file

Modified: logging/log4net/trunk/src/log4net.Tests/log4net.Tests.vs2010.csproj
URL: 
http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net.Tests/log4net.Tests.vs2010.csproj?rev=1669884&r1=1669883&r2=1669884&view=diff
==============================================================================
--- logging/log4net/trunk/src/log4net.Tests/log4net.Tests.vs2010.csproj 
(original)
+++ logging/log4net/trunk/src/log4net.Tests/log4net.Tests.vs2010.csproj Sun Mar 
29 10:00:50 2015
@@ -163,6 +163,9 @@
     <Compile Include="AssemblyInfo.cs">
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="Context\LogicalThreadContextTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
     <Compile Include="Context\ThreadContextTest.cs">
       <SubType>Code</SubType>
     </Compile>

Added: logging/log4net/trunk/src/log4net.Tests/log4net.Tests.vs2012.csproj
URL: 
http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net.Tests/log4net.Tests.vs2012.csproj?rev=1669884&view=auto
==============================================================================
--- logging/log4net/trunk/src/log4net.Tests/log4net.Tests.vs2012.csproj (added)
+++ logging/log4net/trunk/src/log4net.Tests/log4net.Tests.vs2012.csproj Sun Mar 
29 10:00:50 2015
@@ -0,0 +1,248 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+<Project DefaultTargets="Build" 
xmlns="http://schemas.microsoft.com/developer/msbuild/2003"; ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{B0530F10-0238-49A9-93B0-8EF412E90BCF}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>
+    </ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>log4net.Tests</AssemblyName>
+    <AssemblyOriginatorKeyFile>
+    </AssemblyOriginatorKeyFile>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>log4net.Tests</RootNamespace>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' 
">
+    <OutputPath>..\..\build\bin\log4net.Tests\net\4.5\debug\</OutputPath>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    
<DefineConstants>TRACE;DEBUG;DOTNET;FRAMEWORK_3_5_OR_ABOVE;FRAMEWORK_4_0_OR_ABOVE;FRAMEWORK_4_5_OR_ABOVE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 
'Release|AnyCPU' ">
+    <OutputPath>..\..\build\bin\log4net.Tests\net\4.5\release\</OutputPath>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    
<DefineConstants>TRACE;DOTNET;FRAMEWORK_3_5_OR_ABOVE;FRAMEWORK_4_0_OR_ABOVE;FRAMEWORK_4_5_OR_ABOVE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>false</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework, Version=2.5.2.9222, Culture=neutral, 
PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\lib\test\nunit.framework.dll</HintPath>
+    </Reference>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.configuration" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Runtime.Remoting">
+      <Name>System.Runtime.Remoting</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\log4net\AssemblyVersionInfo.cs">
+      <Link>AssemblyVersionInfo.cs</Link>
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\AdoNetAppenderTest.cs" />
+    <Compile Include="Appender\AdoNet\Log4NetCommand.cs" />
+    <Compile Include="Appender\AdoNet\Log4NetConnection.cs" />
+    <Compile Include="Appender\AdoNet\Log4NetParameter.cs" />
+    <Compile Include="Appender\AdoNet\Log4NetParameterCollection.cs" />
+    <Compile Include="Appender\AdoNet\Log4NetTransaction.cs" />
+    <Compile Include="Appender\AppenderCollectionTest.cs" />
+    <Compile Include="Appender\BufferingAppenderTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\CountingAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\EventLogAppenderTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\RemotingAppenderTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\RollingFileAppenderTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\StringAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\TraceAppenderTest.cs" />
+    <Compile Include="AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Context\LogicalThreadContextTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Context\ThreadContextTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\EvaluatorTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\FixingTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\ShutdownTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\StringFormatTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Hierarchy\Hierarchy.cs" />
+    <Compile Include="Hierarchy\Logger.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\DynamicPatternLayoutTest.cs" />
+    <Compile Include="Layout\PatternLayoutTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\XmlLayoutTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="LoggerRepository\ConfigurationMessages.cs" />
+    <Compile Include="Filter\FilterTest.cs" />
+    <Compile Include="Utils.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\CyclicBufferTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\EnvironmentPatternConverterTest.cs" />
+    <Compile Include="Util\LogLogTest.cs" />
+    <Compile Include="Util\PatternConverterTest.cs" />
+    <Compile Include="Util\PatternStringTest.cs" />
+    <Compile Include="Util\PropertiesDictionaryTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\RandomStringPatternConverterTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\SystemInfoTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\TransformTest.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\log4net\log4net.vs2012.csproj">
+      <Project>{181fe707-e161-4722-9f38-6aaab6faa106}</Project>
+      <Name>log4net.vs2012</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>

Propchange: logging/log4net/trunk/src/log4net.Tests/log4net.Tests.vs2012.csproj
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: logging/log4net/trunk/src/log4net/AssemblyInfo.cs
URL: 
http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net/AssemblyInfo.cs?rev=1669884&r1=1669883&r2=1669884&view=diff
==============================================================================
--- logging/log4net/trunk/src/log4net/AssemblyInfo.cs (original)
+++ logging/log4net/trunk/src/log4net/AssemblyInfo.cs Sun Mar 29 10:00:50 2015
@@ -49,7 +49,9 @@ using System.Runtime.CompilerServices;
 //
 
 #if DOTNET
-#if FRAMEWORK_4_0_OR_ABOVE
+#if FRAMEWORK_4_5_OR_ABOVE
+[assembly: AssemblyTitle("Apache log4net for .NET Framework 4.5")]
+#elif FRAMEWORK_4_0_OR_ABOVE
 #if CLIENT_PROFILE
 [assembly: AssemblyTitle("Apache log4net for .NET Framework 4.0 Client 
Profile")]
 #else

Modified: logging/log4net/trunk/src/log4net/LogicalThreadContext.cs
URL: 
http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net/LogicalThreadContext.cs?rev=1669884&r1=1669883&r2=1669884&view=diff
==============================================================================
--- logging/log4net/trunk/src/log4net/LogicalThreadContext.cs (original)
+++ logging/log4net/trunk/src/log4net/LogicalThreadContext.cs Sun Mar 29 
10:00:50 2015
@@ -125,7 +125,7 @@ namespace log4net
                /// The logical thread stacks.
                /// </para>
                /// </remarks>
-               public static ThreadContextStacks Stacks
+               public static LogicalThreadContextStacks Stacks
                {
                        get { return s_stacks; }
                }
@@ -142,7 +142,7 @@ namespace log4net
                /// <summary>
                /// The thread context stacks instance
                /// </summary>
-               private readonly static ThreadContextStacks s_stacks = new 
ThreadContextStacks(s_properties);
+               private readonly static LogicalThreadContextStacks s_stacks = 
new LogicalThreadContextStacks(s_properties);
 
                #endregion Private Static Fields
        }

Modified: 
logging/log4net/trunk/src/log4net/Util/LogicalThreadContextProperties.cs
URL: 
http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net/Util/LogicalThreadContextProperties.cs?rev=1669884&r1=1669883&r2=1669884&view=diff
==============================================================================
--- logging/log4net/trunk/src/log4net/Util/LogicalThreadContextProperties.cs 
(original)
+++ logging/log4net/trunk/src/log4net/Util/LogicalThreadContextProperties.cs 
Sun Mar 29 10:00:50 2015
@@ -98,9 +98,14 @@ namespace log4net.Util
                                return null;
                        }
                        set 
-                       { 
+                       {
                                // Force the dictionary to be created
-                               GetProperties(true)[key] = value; 
+                               var props = GetProperties(true);
+                               // Reason for cloning the dictionary below: 
object instances set on the CallContext
+                               // need to be immutable to correctly flow 
through async/await
+                               var immutableProps = new 
PropertiesDictionary(props);
+                               immutableProps[key] = value;
+                               SetCallContextData(immutableProps);
                        }
                }
 
@@ -122,7 +127,9 @@ namespace log4net.Util
                        PropertiesDictionary dictionary = GetProperties(false);
                        if (dictionary != null)
                        {
-                               dictionary.Remove(key);
+                               var immutableProps = new 
PropertiesDictionary(dictionary);
+                               immutableProps.Remove(key);
+                               SetCallContextData(immutableProps);
                        }
                }
 
@@ -139,7 +146,8 @@ namespace log4net.Util
                        PropertiesDictionary dictionary = GetProperties(false);
                        if (dictionary != null)
                        {
-                               dictionary.Clear();
+                               var immutableProps = new PropertiesDictionary();
+                               SetCallContextData(immutableProps);
                        }
                }
 

Added: logging/log4net/trunk/src/log4net/Util/LogicalThreadContextStack.cs
URL: 
http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net/Util/LogicalThreadContextStack.cs?rev=1669884&view=auto
==============================================================================
--- logging/log4net/trunk/src/log4net/Util/LogicalThreadContextStack.cs (added)
+++ logging/log4net/trunk/src/log4net/Util/LogicalThreadContextStack.cs Sun Mar 
29 10:00:50 2015
@@ -0,0 +1,411 @@
+#region Apache License
+//
+// Licensed to the Apache Software Foundation (ASF) under one or more 
+// contributor license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership. 
+// The ASF licenses this file to you under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with 
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#endregion
+
+using System;
+using System.Collections;
+
+using log4net.Core;
+
+namespace log4net.Util
+{
+
+        /// <summary>
+       /// Delegate type used for LogicalThreadContextStack's callbacks.
+       /// </summary>
+       public delegate void TwoArgAction<T1, T2>(T1 t1, T2 t2);
+
+        /// <summary>
+       /// Implementation of Stack for the <see 
cref="log4net.LogicalThreadContext"/>
+       /// </summary>
+       /// <remarks>
+       /// <para>
+       /// Implementation of Stack for the <see 
cref="log4net.LogicalThreadContext"/>
+       /// </para>
+       /// </remarks>
+       /// <author>Nicko Cadell</author>
+       public sealed class LogicalThreadContextStack : IFixingRequired
+       {
+               #region Private Instance Fields
+
+               /// <summary>
+               /// The stack store.
+               /// </summary>
+               private Stack m_stack = new Stack();
+
+               /// <summary>
+               /// The name of this <see 
cref="log4net.Util.LogicalThreadContextStack"/> within the
+               /// <see cref="log4net.Util.LogicalThreadContextProperties"/>.
+               /// </summary>
+               private string m_propertyKey;
+
+               /// <summary>
+               /// The callback used to let the <see 
cref="log4net.Util.LogicalThreadContextStacks"/> register a
+               /// new instance of a <see 
cref="log4net.Util.LogicalThreadContextStack"/>.
+               /// </summary>
+               private TwoArgAction<string, LogicalThreadContextStack> 
m_registerNew;
+
+               #endregion Private Instance Fields
+
+               #region Public Instance Constructors
+
+               /// <summary>
+               /// Internal constructor
+               /// </summary>
+               /// <remarks>
+               /// <para>
+               /// Initializes a new instance of the <see 
cref="LogicalThreadContextStack" /> class. 
+               /// </para>
+               /// </remarks>
+               internal LogicalThreadContextStack(string propertyKey, 
TwoArgAction<string, LogicalThreadContextStack> registerNew)
+               {
+                       m_propertyKey = propertyKey;
+                       m_registerNew = registerNew;
+               }
+
+               #endregion Public Instance Constructors
+
+               #region Public Properties
+
+               /// <summary>
+               /// The number of messages in the stack
+               /// </summary>
+               /// <value>
+               /// The current number of messages in the stack
+               /// </value>
+               /// <remarks>
+               /// <para>
+               /// The current number of messages in the stack. That is
+               /// the number of times <see cref="Push"/> has been called
+               /// minus the number of times <see cref="Pop"/> has been called.
+               /// </para>
+               /// </remarks>
+               public int Count
+               {
+                       get { return m_stack.Count; }
+               }
+
+               #endregion // Public Properties
+
+               #region Public Methods
+
+               /// <summary>
+               /// Clears all the contextual information held in this stack.
+               /// </summary>
+               /// <remarks>
+               /// <para>
+               /// Clears all the contextual information held in this stack.
+               /// Only call this if you think that this thread is being 
reused after
+               /// a previous call execution which may not have completed 
correctly.
+               /// You do not need to use this method if you always guarantee 
to call
+               /// the <see cref="IDisposable.Dispose"/> method of the <see 
cref="IDisposable"/>
+               /// returned from <see cref="Push"/> even in exceptional 
circumstances,
+               /// for example by using the 
<c>using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message"))</c> 
+               /// syntax.
+               /// </para>
+               /// </remarks>
+               public void Clear()
+               {
+                       m_registerNew(m_propertyKey, new 
LogicalThreadContextStack(m_propertyKey, m_registerNew));
+               }
+
+               /// <summary>
+               /// Removes the top context from this stack.
+               /// </summary>
+               /// <returns>The message in the context that was removed from 
the top of this stack.</returns>
+               /// <remarks>
+               /// <para>
+               /// Remove the top context from this stack, and return
+               /// it to the caller. If this stack is empty then an
+               /// empty string (not <see langword="null"/>) is returned.
+               /// </para>
+               /// </remarks>
+               public string Pop()
+               {
+                       // copy current stack
+                       Stack stack = new Stack(new Stack(m_stack));
+                       string result = "";
+                       if (stack.Count > 0)
+                       {
+                               result = ((StackFrame)(stack.Pop())).Message;
+                       }
+                       m_registerNew(m_propertyKey,
+                               new LogicalThreadContextStack(m_propertyKey, 
m_registerNew) { m_stack = stack });
+                       return result;
+               }
+
+               /// <summary>
+               /// Pushes a new context message into this stack.
+               /// </summary>
+               /// <param name="message">The new context message.</param>
+               /// <returns>
+               /// An <see cref="IDisposable"/> that can be used to clean up 
the context stack.
+               /// </returns>
+               /// <remarks>
+               /// <para>
+               /// Pushes a new context onto this stack. An <see 
cref="IDisposable"/>
+               /// is returned that can be used to clean up this stack. This
+               /// can be easily combined with the <c>using</c> keyword to 
scope the
+               /// context.
+               /// </para>
+               /// </remarks>
+               /// <example>Simple example of using the <c>Push</c> method 
with the <c>using</c> keyword.
+               /// <code lang="C#">
+               /// 
using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message"))
+               /// {
+               ///             log.Warn("This should have an ThreadContext 
Stack message");
+               ///     }
+               /// </code>
+               /// </example>
+               public IDisposable Push(string message)
+               {
+                       // do modifications on a copy
+                       Stack stack = new Stack(new Stack(m_stack));
+                       stack.Push(new StackFrame(message, (stack.Count > 0) ? 
(StackFrame)stack.Peek() : null));
+
+                       var contextStack = new 
LogicalThreadContextStack(m_propertyKey, m_registerNew) { m_stack = stack };
+                       m_registerNew(m_propertyKey, contextStack);
+                       return new AutoPopStackFrame(contextStack, stack.Count 
- 1);
+               }
+
+               #endregion Public Methods
+
+               #region Internal Methods
+
+               /// <summary>
+               /// Gets the current context information for this stack.
+               /// </summary>
+               /// <returns>The current context information.</returns>
+               internal string GetFullMessage()
+               {
+                       Stack stack = m_stack;
+                       if (stack.Count > 0)
+                       {
+                               return ((StackFrame)(stack.Peek())).FullMessage;
+                       }
+                       return null;
+               }
+
+               /// <summary>
+               /// Gets and sets the internal stack used by this <see 
cref="LogicalThreadContextStack"/>
+               /// </summary>
+               /// <value>The internal storage stack</value>
+               /// <remarks>
+               /// <para>
+               /// This property is provided only to support backward 
compatability 
+               /// of the <see cref="NDC"/>. Tytpically the internal stack 
should not
+               /// be modified.
+               /// </para>
+               /// </remarks>
+               internal Stack InternalStack
+               {
+                       get { return m_stack; }
+                       set { m_stack = value; }
+               }
+
+               #endregion Internal Methods
+
+               /// <summary>
+               /// Gets the current context information for this stack.
+               /// </summary>
+               /// <returns>Gets the current context information</returns>
+               /// <remarks>
+               /// <para>
+               /// Gets the current context information for this stack.
+               /// </para>
+               /// </remarks>
+               public override string ToString()
+               {
+                       return GetFullMessage();
+               }
+
+               /// <summary>
+               /// Get a portable version of this object
+               /// </summary>
+               /// <returns>the portable instance of this object</returns>
+               /// <remarks>
+               /// <para>
+               /// Get a cross thread portable version of this object
+               /// </para>
+               /// </remarks>
+               object IFixingRequired.GetFixedObject()
+               {
+                       return GetFullMessage();
+               }
+
+               /// <summary>
+               /// Inner class used to represent a single context frame in the 
stack.
+               /// </summary>
+               /// <remarks>
+               /// <para>
+               /// Inner class used to represent a single context frame in the 
stack.
+               /// </para>
+               /// </remarks>
+               private sealed class StackFrame
+               {
+                       #region Private Instance Fields
+
+                       private readonly string m_message;
+                       private readonly StackFrame m_parent;
+                       private string m_fullMessage = null;
+
+                       #endregion
+
+                       #region Internal Instance Constructors
+
+                       /// <summary>
+                       /// Constructor
+                       /// </summary>
+                       /// <param name="message">The message for this 
context.</param>
+                       /// <param name="parent">The parent context in the 
chain.</param>
+                       /// <remarks>
+                       /// <para>
+                       /// Initializes a new instance of the <see 
cref="StackFrame" /> class
+                       /// with the specified message and parent context.
+                       /// </para>
+                       /// </remarks>
+                       internal StackFrame(string message, StackFrame parent)
+                       {
+                               m_message = message;
+                               m_parent = parent;
+
+                               if (parent == null)
+                               {
+                                       m_fullMessage = message;
+                               }
+                       }
+
+                       #endregion Internal Instance Constructors
+
+                       #region Internal Instance Properties
+
+                       /// <summary>
+                       /// Get the message.
+                       /// </summary>
+                       /// <value>The message.</value>
+                       /// <remarks>
+                       /// <para>
+                       /// Get the message.
+                       /// </para>
+                       /// </remarks>
+                       internal string Message
+                       {
+                               get { return m_message; }
+                       }
+
+                       /// <summary>
+                       /// Gets the full text of the context down to the root 
level.
+                       /// </summary>
+                       /// <value>
+                       /// The full text of the context down to the root level.
+                       /// </value>
+                       /// <remarks>
+                       /// <para>
+                       /// Gets the full text of the context down to the root 
level.
+                       /// </para>
+                       /// </remarks>
+                       internal string FullMessage
+                       {
+                               get
+                               {
+                                       if (m_fullMessage == null && m_parent 
!= null)
+                                       {
+                                               m_fullMessage = 
string.Concat(m_parent.FullMessage, " ", m_message);
+                                       }
+                                       return m_fullMessage;
+                               }
+                       }
+
+                       #endregion Internal Instance Properties
+               }
+
+               /// <summary>
+               /// Struct returned from the <see 
cref="LogicalThreadContextStack.Push"/> method.
+               /// </summary>
+               /// <remarks>
+               /// <para>
+               /// This struct implements the <see cref="IDisposable"/> and is 
designed to be used
+               /// with the <see langword="using"/> pattern to remove the 
stack frame at the end of the scope.
+               /// </para>
+               /// </remarks>
+               private struct AutoPopStackFrame : IDisposable
+               {
+                       #region Private Instance Fields
+
+                       /// <summary>
+                       /// The depth to trim the stack to when this instance 
is disposed
+                       /// </summary>
+                       private int m_frameDepth;
+
+                       /// <summary>
+                       /// The outer LogicalThreadContextStack.
+                       /// </summary>
+                       private LogicalThreadContextStack 
m_logicalThreadContextStack;
+
+                       #endregion Private Instance Fields
+
+                       #region Internal Instance Constructors
+
+                       /// <summary>
+                       /// Constructor
+                       /// </summary>
+                       /// <param name="logicalThreadContextStack">The 
internal stack used by the ThreadContextStack.</param>
+                       /// <param name="frameDepth">The depth to return the 
stack to when this object is disposed.</param>
+                       /// <remarks>
+                       /// <para>
+                       /// Initializes a new instance of the <see 
cref="AutoPopStackFrame" /> class with
+                       /// the specified stack and return depth.
+                       /// </para>
+                       /// </remarks>
+                       internal AutoPopStackFrame(LogicalThreadContextStack 
logicalThreadContextStack, int frameDepth)
+                       {
+                               m_frameDepth = frameDepth;
+                               m_logicalThreadContextStack = 
logicalThreadContextStack;
+                       }
+
+                       #endregion Internal Instance Constructors
+
+                       #region Implementation of IDisposable
+
+                       /// <summary>
+                       /// Returns the stack to the correct depth.
+                       /// </summary>
+                       /// <remarks>
+                       /// <para>
+                       /// Returns the stack to the correct depth.
+                       /// </para>
+                       /// </remarks>
+                       public void Dispose()
+                       {
+                               if (m_frameDepth >= 0 && 
m_logicalThreadContextStack.m_stack != null)
+                               {
+                                       Stack stack = new Stack(new 
Stack(m_logicalThreadContextStack.m_stack));
+                                       while (stack.Count > m_frameDepth)
+                                       {
+                                               stack.Pop();
+                                       }
+                                       
m_logicalThreadContextStack.m_registerNew(m_logicalThreadContextStack.m_propertyKey,
+                                               new 
LogicalThreadContextStack(m_logicalThreadContextStack.m_propertyKey, 
m_logicalThreadContextStack.m_registerNew) { m_stack = stack });
+                               }
+                       }
+
+                       #endregion Implementation of IDisposable
+               }
+
+       }
+}

Propchange: logging/log4net/trunk/src/log4net/Util/LogicalThreadContextStack.cs
------------------------------------------------------------------------------
    svn:eol-style = native

Added: logging/log4net/trunk/src/log4net/Util/LogicalThreadContextStacks.cs
URL: 
http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net/Util/LogicalThreadContextStacks.cs?rev=1669884&view=auto
==============================================================================
--- logging/log4net/trunk/src/log4net/Util/LogicalThreadContextStacks.cs (added)
+++ logging/log4net/trunk/src/log4net/Util/LogicalThreadContextStacks.cs Sun 
Mar 29 10:00:50 2015
@@ -0,0 +1,133 @@
+#region Apache License
+//
+// Licensed to the Apache Software Foundation (ASF) under one or more 
+// contributor license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership. 
+// The ASF licenses this file to you under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with 
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#endregion
+
+using System;
+using System.Collections;
+
+namespace log4net.Util
+{
+       /// <summary>
+       /// Implementation of Stacks collection for the <see 
cref="log4net.LogicalThreadContext"/>
+       /// </summary>
+       /// <remarks>
+       /// <para>
+       /// Implementation of Stacks collection for the <see 
cref="log4net.LogicalThreadContext"/>
+       /// </para>
+       /// </remarks>
+       /// <author>Nicko Cadell</author>
+       public sealed class LogicalThreadContextStacks
+       {
+               private readonly LogicalThreadContextProperties m_properties;
+
+               #region Public Instance Constructors
+
+               /// <summary>
+               /// Internal constructor
+               /// </summary>
+               /// <remarks>
+               /// <para>
+               /// Initializes a new instance of the <see 
cref="ThreadContextStacks" /> class.
+               /// </para>
+               /// </remarks>
+               internal 
LogicalThreadContextStacks(LogicalThreadContextProperties properties)
+               {
+                       m_properties = properties;
+               }
+
+               #endregion Public Instance Constructors
+
+               #region Public Instance Properties
+
+               /// <summary>
+               /// Gets the named thread context stack
+               /// </summary>
+               /// <value>
+               /// The named stack
+               /// </value>
+               /// <remarks>
+               /// <para>
+               /// Gets the named thread context stack
+               /// </para>
+               /// </remarks>
+               public LogicalThreadContextStack this[string key]
+               {
+                       get
+                       {
+                               LogicalThreadContextStack stack = null;
+
+                               object propertyValue = m_properties[key];
+                               if (propertyValue == null)
+                               {
+                                       // Stack does not exist, create
+                                       stack = new 
LogicalThreadContextStack(key, registerNew);
+                                       m_properties[key] = stack;
+                               }
+                               else
+                               {
+                                       // Look for existing stack
+                                       stack = propertyValue as 
LogicalThreadContextStack;
+                                       if (stack == null)
+                                       {
+                                               // Property is not set to a 
stack!
+                                               string propertyValueString = 
SystemInfo.NullText;
+
+                                               try
+                                               {
+                                                       propertyValueString = 
propertyValue.ToString();
+                                               }
+                                               catch
+                                               {
+                                               }
+
+                                               LogLog.Error(declaringType, 
"ThreadContextStacks: Request for stack named [" + key + "] failed because a 
property with the same name exists which is a [" + propertyValue.GetType().Name 
+ "] with value [" + propertyValueString + "]");
+
+                                               stack = new 
LogicalThreadContextStack(key, registerNew);
+                                       }
+                               }
+
+                               return stack;
+                       }
+               }
+
+               #endregion Public Instance Properties
+
+               #region Private Instance Fields
+
+               private void registerNew(string stackName, 
LogicalThreadContextStack stack)
+               {
+                       m_properties[stackName] = stack;
+               }
+
+               #endregion Private Instance Fields
+
+               #region Private Static Fields
+
+               /// <summary>
+               /// The fully qualified type of the ThreadContextStacks class.
+               /// </summary>
+               /// <remarks>
+               /// Used by the internal logger to record the Type of the
+               /// log message.
+               /// </remarks>
+               private readonly static Type declaringType = 
typeof(LogicalThreadContextStacks);
+
+               #endregion Private Static Fields
+       }
+}
+

Propchange: logging/log4net/trunk/src/log4net/Util/LogicalThreadContextStacks.cs
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: logging/log4net/trunk/src/log4net/log4net.vs2010.csproj
URL: 
http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net/log4net.vs2010.csproj?rev=1669884&r1=1669883&r2=1669884&view=diff
==============================================================================
--- logging/log4net/trunk/src/log4net/log4net.vs2010.csproj (original)
+++ logging/log4net/trunk/src/log4net/log4net.vs2010.csproj Sun Mar 29 10:00:50 
2015
@@ -723,9 +723,15 @@
     <Compile Include="Util\ThreadContextProperties.cs">
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="Util\LogicalThreadContextStack.cs">
+      <SubType>Code</SubType>
+    </Compile>
     <Compile Include="Util\ThreadContextStack.cs">
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="Util\LogicalThreadContextStacks.cs">
+      <SubType>Code</SubType>
+    </Compile>
     <Compile Include="Util\ThreadContextStacks.cs">
       <SubType>Code</SubType>
     </Compile>

Added: logging/log4net/trunk/src/log4net/log4net.vs2012.csproj
URL: 
http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net/log4net.vs2012.csproj?rev=1669884&view=auto
==============================================================================
--- logging/log4net/trunk/src/log4net/log4net.vs2012.csproj (added)
+++ logging/log4net/trunk/src/log4net/log4net.vs2012.csproj Sun Mar 29 10:00:50 
2015
@@ -0,0 +1,802 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+<Project DefaultTargets="Build" 
xmlns="http://schemas.microsoft.com/developer/msbuild/2003"; ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{181FE707-E161-4722-9F38-6AAAB6FAA106}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>
+    </ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>log4net</AssemblyName>
+    <AssemblyOriginatorKeyFile>
+    </AssemblyOriginatorKeyFile>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>log4net</RootNamespace>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' 
">
+    <OutputPath>..\..\build\bin\log4net\net\4.5\debug\</OutputPath>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    
<DefineConstants>TRACE;DEBUG;DOTNET;FRAMEWORK_3_5_OR_ABOVE;FRAMEWORK_4_0_OR_ABOVE;FRAMEWORK_4_5_OR_ABOVE</DefineConstants>
+    <DocumentationFile>log4net.xml</DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>SecurityRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 
'Release|AnyCPU' ">
+    <OutputPath>..\..\build\bin\log4net\net\4.5\release\</OutputPath>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    
<DefineConstants>TRACE;STRONG;DOTNET;FRAMEWORK_3_5_OR_ABOVE;FRAMEWORK_4_0_OR_ABOVE;FRAMEWORK_4_5_OR_ABOVE</DefineConstants>
+    <DocumentationFile>log4net.xml</DocumentationFile>
+    <DebugSymbols>false</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.configuration" />
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Web">
+      <Name>System.Web</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Appender\AdoNetAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\AnsiColorTerminalAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\AppenderCollection.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\AppenderSkeleton.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\AspNetTraceAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\BufferingAppenderSkeleton.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\BufferingForwardingAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\ColoredConsoleAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\ConsoleAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\DebugAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\EventLogAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\FileAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\ForwardingAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\IAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\IBulkAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\LocalSyslogAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\ManagedColoredConsoleAppender.cs" />
+    <Compile Include="Appender\MemoryAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\NetSendAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\OutputDebugStringAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\RemoteSyslogAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\RemotingAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\RollingFileAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\SmtpAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\SmtpPickupDirAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\TelnetAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\TextWriterAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\TraceAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\UdpAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="AssemblyVersionInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Config\AliasDomainAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Config\AliasRepositoryAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Config\BasicConfigurator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Config\ConfiguratorAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Config\DomainAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Config\DOMConfigurator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Config\DOMConfiguratorAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Config\Log4NetConfigurationSectionHandler.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Config\PluginAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Config\RepositoryAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Config\SecurityContextProviderAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Config\XmlConfigurator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Config\XmlConfiguratorAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\CompactRepositorySelector.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\DefaultRepositorySelector.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\ErrorCode.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\ExceptionEvaluator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\IAppenderAttachable.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\IErrorHandler.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\IFixingRequired.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\ILogger.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\ILoggerWrapper.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\IOptionHandler.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\IRepositorySelector.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\ITriggeringEventEvaluator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\Level.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\LevelCollection.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\LevelEvaluator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\LevelMap.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\LocationInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\LogException.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\LoggerManager.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\LoggerWrapperImpl.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\LoggingEvent.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\LogImpl.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\MethodItem.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\SecurityContext.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\SecurityContextProvider.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\StackFrameItem.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\TimeEvaluator.cs" />
+    <Compile Include="Core\WrapperMap.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="DateFormatter\AbsoluteTimeDateFormatter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="DateFormatter\DateTimeDateFormatter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="DateFormatter\IDateFormatter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="DateFormatter\Iso8601DateFormatter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="DateFormatter\SimpleDateFormatter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Filter\DenyAllFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Filter\FilterDecision.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Filter\FilterSkeleton.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Filter\IFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Filter\LevelMatchFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Filter\LevelRangeFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Filter\LoggerMatchFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Filter\MdcFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Filter\NdcFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Filter\PropertyFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Filter\StringMatchFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="GlobalContext.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="ILog.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\DynamicPatternLayout.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\ExceptionLayout.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\ILayout.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\IRawLayout.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Layout2RawLayoutAdapter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\LayoutSkeleton.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\PatternLayout.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\AppDomainPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\AspNetCachePatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\AspNetContextPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\AspNetPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\AspNetRequestPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\AspNetSessionPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\DatePatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\ExceptionPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\FileLocationPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\FullLocationPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\IdentityPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\LevelPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\LineLocationPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\LoggerPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\MessagePatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\MethodLocationPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\NamedPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\NdcPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\PatternLayoutConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\PropertyPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\RelativeTimePatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\StackTraceDetailPatternConverter.cs" />
+    <Compile Include="Layout\Pattern\StackTracePatternConverter.cs" />
+    <Compile Include="Layout\Pattern\ThreadPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\TypeNamePatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\UserNamePatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\UtcDatePatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\RawLayoutConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\RawPropertyLayout.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\RawTimeStampLayout.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\RawUtcTimeStampLayout.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\SimpleLayout.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\XmlLayout.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\XmlLayoutBase.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\XmlLayoutSchemaLog4j.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="LogicalThreadContext.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="LogManager.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="MDC.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="NDC.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="ObjectRenderer\DefaultRenderer.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="ObjectRenderer\IObjectRenderer.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="ObjectRenderer\RendererMap.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Plugin\IPlugin.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Plugin\IPluginFactory.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Plugin\PluginCollection.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Plugin\PluginMap.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Plugin\PluginSkeleton.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Plugin\RemoteLoggingServerPlugin.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Repository\ConfigurationChangedEventArgs.cs" />
+    <Compile Include="Repository\Hierarchy\DefaultLoggerFactory.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Repository\Hierarchy\Hierarchy.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Repository\Hierarchy\ILoggerFactory.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Repository\Hierarchy\Logger.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Repository\Hierarchy\LoggerKey.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Repository\Hierarchy\ProvisionNode.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Repository\Hierarchy\RootLogger.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Repository\Hierarchy\XmlHierarchyConfigurator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Repository\IBasicRepositoryConfigurator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Repository\ILoggerRepository.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Repository\IXmlRepositoryConfigurator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Repository\LoggerRepositorySkeleton.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="ThreadContext.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\AppenderAttachedImpl.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\CompositeProperties.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\ContextPropertiesBase.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\ConverterInfo.cs" />
+    <Compile Include="Util\CountingQuietTextWriter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\CyclicBuffer.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\EmptyCollection.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\EmptyDictionary.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\FormattingInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\GlobalContextProperties.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\ILogExtensions.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\LevelMapping.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\LevelMappingEntry.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\LogicalThreadContextProperties.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\LogLog.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\NativeError.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\NullDictionaryEnumerator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\NullEnumerator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\NullSecurityContext.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\OnlyOnceErrorHandler.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\OptionConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\PatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\PatternParser.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\PatternString.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile 
Include="Util\PatternStringConverters\AppDomainPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\PatternStringConverters\DatePatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile 
Include="Util\PatternStringConverters\EnvironmentFolderPathPatternConverter.cs" 
/>
+    <Compile 
Include="Util\PatternStringConverters\EnvironmentPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile 
Include="Util\PatternStringConverters\IdentityPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\PatternStringConverters\LiteralPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\PatternStringConverters\NewLinePatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile 
Include="Util\PatternStringConverters\ProcessIdPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile 
Include="Util\PatternStringConverters\PropertyPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile 
Include="Util\PatternStringConverters\RandomStringPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile 
Include="Util\PatternStringConverters\UserNamePatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\PatternStringConverters\UtcDatePatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\PropertiesDictionary.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\PropertyEntry.cs" />
+    <Compile Include="Util\ProtectCloseTextWriter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\QuietTextWriter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\ReaderWriterLock.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\ReadOnlyPropertiesDictionary.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\ReusableStringWriter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\SystemInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\SystemStringFormat.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\TextWriterAdapter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\ThreadContextProperties.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\LogicalThreadContextStack.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\ThreadContextStack.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\LogicalThreadContextStacks.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\ThreadContextStacks.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\Transform.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\TypeConverters\BooleanConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\TypeConverters\ConversionNotSupportedException.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\TypeConverters\ConverterRegistry.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\TypeConverters\EncodingConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\TypeConverters\IConvertFrom.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\TypeConverters\IConvertTo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\TypeConverters\IPAddressConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\TypeConverters\PatternLayoutConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\TypeConverters\PatternStringConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\TypeConverters\TypeConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\TypeConverters\TypeConverterAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\WindowsSecurityContext.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>

Propchange: logging/log4net/trunk/src/log4net/log4net.vs2012.csproj
------------------------------------------------------------------------------
    svn:eol-style = native

Added: logging/log4net/trunk/src/log4net/log4net.vs2012.sln
URL: 
http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net/log4net.vs2012.sln?rev=1669884&view=auto
==============================================================================
--- logging/log4net/trunk/src/log4net/log4net.vs2012.sln (added)
+++ logging/log4net/trunk/src/log4net/log4net.vs2012.sln Sun Mar 29 10:00:50 
2015
@@ -0,0 +1,45 @@
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+#
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "log4net.vs2012", 
"log4net.vs2012.csproj", "{181FE707-E161-4722-9F38-6AAAB6FAA106}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "log4net.Tests.vs2012", 
"..\log4net.Tests\log4net.Tests.vs2012.csproj", 
"{B0530F10-0238-49A9-93B0-8EF412E90BCF}"
+EndProject
+Global
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution
+               Debug|Any CPU = Debug|Any CPU
+               Release|Any CPU = Release|Any CPU
+       EndGlobalSection
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution
+               {181FE707-E161-4722-9F38-6AAAB6FAA106}.Debug|Any CPU.ActiveCfg 
= Debug|Any CPU
+               {181FE707-E161-4722-9F38-6AAAB6FAA106}.Debug|Any CPU.Build.0 = 
Debug|Any CPU
+               {181FE707-E161-4722-9F38-6AAAB6FAA106}.Release|Any 
CPU.ActiveCfg = Release|Any CPU
+               {181FE707-E161-4722-9F38-6AAAB6FAA106}.Release|Any CPU.Build.0 
= Release|Any CPU
+               {B0530F10-0238-49A9-93B0-8EF412E90BCF}.Debug|Any CPU.ActiveCfg 
= Debug|Any CPU
+               {B0530F10-0238-49A9-93B0-8EF412E90BCF}.Debug|Any CPU.Build.0 = 
Debug|Any CPU
+               {B0530F10-0238-49A9-93B0-8EF412E90BCF}.Release|Any 
CPU.ActiveCfg = Release|Any CPU
+               {B0530F10-0238-49A9-93B0-8EF412E90BCF}.Release|Any CPU.Build.0 
= Release|Any CPU
+       EndGlobalSection
+       GlobalSection(SolutionProperties) = preSolution
+               HideSolutionNode = FALSE
+       EndGlobalSection
+EndGlobal

Propchange: logging/log4net/trunk/src/log4net/log4net.vs2012.sln
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to