You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by bo...@apache.org on 2013/08/14 16:46:39 UTC
svn commit: r1513912 - in /logging/log4net/branches/1.2.12: ./
src/Util/SystemInfo.cs tests/src/Util/SystemInfoTest.cs
Author: bodewig
Date: Wed Aug 14 14:46:39 2013
New Revision: 1513912
URL: http://svn.apache.org/r1513912
Log:
merge fix for LOG4NET-388
Modified:
logging/log4net/branches/1.2.12/ (props changed)
logging/log4net/branches/1.2.12/src/Util/SystemInfo.cs
logging/log4net/branches/1.2.12/tests/src/Util/SystemInfoTest.cs
Propchange: logging/log4net/branches/1.2.12/
------------------------------------------------------------------------------
Merged /logging/log4net/trunk:r1513751
Modified: logging/log4net/branches/1.2.12/src/Util/SystemInfo.cs
URL: http://svn.apache.org/viewvc/logging/log4net/branches/1.2.12/src/Util/SystemInfo.cs?rev=1513912&r1=1513911&r2=1513912&view=diff
==============================================================================
--- logging/log4net/branches/1.2.12/src/Util/SystemInfo.cs (original)
+++ logging/log4net/branches/1.2.12/src/Util/SystemInfo.cs Wed Aug 14 14:46:39 2013
@@ -457,10 +457,38 @@ namespace log4net.Util
{
try
{
- // This call requires FileIOPermission for access to the path
- // if we don't have permission then we just ignore it and
- // carry on.
- return myAssembly.Location;
+#if NET_4_0
+ if (myAssembly.IsDynamic)
+ {
+ return "Dynamic Assembly";
+ }
+#else
+ if (myAssembly is System.Reflection.Emit.AssemblyBuilder)
+ {
+ return "Dynamic Assembly";
+ }
+ else if(myAssembly.GetType().FullName == "System.Reflection.Emit.InternalAssemblyBuilder")
+ {
+ return "Dynamic Assembly";
+ }
+#endif
+ else
+ {
+ // This call requires FileIOPermission for access to the path
+ // if we don't have permission then we just ignore it and
+ // carry on.
+ return myAssembly.Location;
+ }
+ }
+ catch (NotSupportedException)
+ {
+ // The location information may be unavailable for dynamic assemblies and a NotSupportedException
+ // is thrown in those cases. See: http://msdn.microsoft.com/de-de/library/system.reflection.assembly.location.aspx
+ return "Dynamic Assembly";
+ }
+ catch (TargetInvocationException ex)
+ {
+ return "Location Detect Failed (" + ex.Message + ")";
}
catch (ArgumentException ex)
{
Modified: logging/log4net/branches/1.2.12/tests/src/Util/SystemInfoTest.cs
URL: http://svn.apache.org/viewvc/logging/log4net/branches/1.2.12/tests/src/Util/SystemInfoTest.cs?rev=1513912&r1=1513911&r2=1513912&view=diff
==============================================================================
--- logging/log4net/branches/1.2.12/tests/src/Util/SystemInfoTest.cs (original)
+++ logging/log4net/branches/1.2.12/tests/src/Util/SystemInfoTest.cs Wed Aug 14 14:46:39 2013
@@ -23,6 +23,11 @@ using log4net.Util;
using NUnit.Framework;
+#if NET_4_0
+using System.Linq.Expressions;
+using System.Reflection;
+#endif
+
namespace log4net.Tests.Util
{
/// <summary>
@@ -31,6 +36,39 @@ namespace log4net.Tests.Util
[TestFixture]
public class SystemInfoTest
{
+
+#if NET_4_0
+ /// <summary>
+ /// It's "does not throw not supported exception" NOT
+ /// "returns 'Dynamic Assembly' string for dynamic assemblies" by purpose.
+ /// <see cref="Assembly.GetCallingAssembly"/> can be JITted and inlined in different release configurations,
+ /// thus we cannot determine what the exact result of this test will be.
+ /// In 'Debug' GetCallingAssembly should return dynamic assembly named: 'Anonymously Hosted DynamicMethods Assembly'
+ /// whereas in 'Release' this will be inlined and the result will be something like 'X:\Y\Z\log4net.Tests.dll'.
+ /// Therefore simple check against dynamic assembly
+ /// in <see cref="SystemInfo.AssemblyLocationInfo"/> to avoid <see cref="NotSupportedException"/> 'Debug' release.
+ /// </summary>
+ [Test]
+ public void TestAssemblyLocationInfoDoesNotThrowNotSupportedExceptionForDynamicAssembly()
+ {
+ var systemInfoAssemblyLocationMethod = GetAssemblyLocationInfoMethodCall();
+
+ Assert.DoesNotThrow(() => systemInfoAssemblyLocationMethod());
+ }
+
+ private static Func<string> GetAssemblyLocationInfoMethodCall()
+ {
+ var method = typeof(SystemInfoTest).GetMethod("TestAssemblyLocationInfoMethod", new Type[0]);
+ var methodCall = Expression.Call(null, method, new Expression[0]);
+ return Expression.Lambda<Func<string>>(methodCall, new ParameterExpression[0]).Compile();
+ }
+
+ public static string TestAssemblyLocationInfoMethod()
+ {
+ return SystemInfo.AssemblyLocationInfo(Assembly.GetCallingAssembly());
+ }
+#endif
+
[Test]
public void TestGetTypeFromStringFullyQualified()
{