Skip to content
This repository was archived by the owner on Dec 5, 2019. It is now read-only.

Commit 6463310

Browse files
authored
Merge pull request #223 from kll/feature/merged-assembly-support
Add support for merged assemblies.
2 parents e61af70 + 6805448 commit 6463310

11 files changed

Lines changed: 103 additions & 49 deletions

src/LibLog/LogExtensions.cs.pp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1-
// <auto-generated/>
1+
// <auto-generated/>
22
// ReSharper disable CheckNamespace
33
namespace $rootnamespace$.Logging
44
{
55
using System;
6+
#if LIBLOG_EXCLUDE_CODE_COVERAGE
7+
using System.Diagnostics.CodeAnalysis;
8+
#endif
69

710
/// <summary>
811
/// Extension methods for the <see cref="ILog"/> interface.
912
/// </summary>
1013
#if LIBLOG_EXCLUDE_CODE_COVERAGE
11-
using System.Diagnostics.CodeAnalysis;
12-
1314
[ExcludeFromCodeCoverage]
1415
#endif
1516
#if LIBLOG_PUBLIC

src/LibLog/LogProviders/Log4NetLogProvider.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ internal static bool IsLoggerAvailable()
3636

3737
protected override OpenNdc GetOpenNdcMethod()
3838
{
39-
var logicalThreadContextType = Type.GetType("log4net.LogicalThreadContext, log4net");
39+
var logicalThreadContextType = FindType("log4net.LogicalThreadContext", "log4net");
4040
var stacksProperty = logicalThreadContextType.GetProperty("Stacks");
4141
var logicalThreadContextStacksType = stacksProperty.PropertyType;
4242
var stacksIndexerProperty = logicalThreadContextStacksType.GetProperty("Item");
@@ -64,7 +64,7 @@ protected override OpenNdc GetOpenNdcMethod()
6464

6565
protected override OpenMdc GetOpenMdcMethod()
6666
{
67-
var logicalThreadContextType = Type.GetType("log4net.LogicalThreadContext, log4net");
67+
var logicalThreadContextType = FindType("log4net.LogicalThreadContext", "log4net");
6868
var propertiesProperty = logicalThreadContextType.GetProperty("Properties");
6969
var logicalThreadContextPropertiesType = propertiesProperty.PropertyType;
7070
var propertiesIndexerProperty = logicalThreadContextPropertiesType.GetProperty("Item");
@@ -101,7 +101,7 @@ protected override OpenMdc GetOpenMdcMethod()
101101

102102
private static Type GetLogManagerType()
103103
{
104-
return Type.GetType("log4net.LogManager, log4net");
104+
return FindType("log4net.LogManager", "log4net");
105105
}
106106

107107
private static Func<string, object> GetGetLoggerMethodCall()
@@ -149,7 +149,7 @@ private static bool Initialize()
149149
{
150150
try
151151
{
152-
var logEventLevelType = Type.GetType("log4net.Core.Level, log4net");
152+
var logEventLevelType = FindType("log4net.Core.Level", "log4net");
153153
if (logEventLevelType == null) throw new LibLogException("Type log4net.Core.Level was not found.");
154154

155155
var levelFields = logEventLevelType.GetFields().ToList();
@@ -161,7 +161,7 @@ private static bool Initialize()
161161
s_levelFatal = levelFields.First(x => x.Name == "Fatal").GetValue(null);
162162

163163
// Func<object, object, bool> isEnabledFor = (logger, level) => { return ((log4net.Core.ILogger)logger).IsEnabled(level); }
164-
var loggerType = Type.GetType("log4net.Core.ILogger, log4net");
164+
var loggerType = FindType("log4net.Core.ILogger", "log4net");
165165
if (loggerType == null) throw new LibLogException("Type log4net.Core.ILogger, was not found.");
166166
var instanceParam = Expression.Parameter(typeof(object));
167167
var instanceCast = Expression.Convert(instanceParam, loggerType);
@@ -170,7 +170,7 @@ private static bool Initialize()
170170
s_isEnabledForDelegate = GetIsEnabledFor(loggerType, logEventLevelType, instanceCast, levelCast,
171171
instanceParam, levelParam);
172172

173-
var loggingEventType = Type.GetType("log4net.Core.LoggingEvent, log4net");
173+
var loggingEventType = FindType("log4net.Core.LoggingEvent", "log4net");
174174

175175
s_createLoggingEvent = GetCreateLoggingEvent(instanceParam, instanceCast, levelParam, levelCast,
176176
loggingEventType);

src/LibLog/LogProviders/Log4NetLogProvider.cs.pp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838

3939
protected override OpenNdc GetOpenNdcMethod()
4040
{
41-
var logicalThreadContextType = Type.GetType("log4net.LogicalThreadContext, log4net");
41+
var logicalThreadContextType = FindType("log4net.LogicalThreadContext", "log4net");
4242
var stacksProperty = logicalThreadContextType.GetProperty("Stacks");
4343
var logicalThreadContextStacksType = stacksProperty.PropertyType;
4444
var stacksIndexerProperty = logicalThreadContextStacksType.GetProperty("Item");
@@ -66,7 +66,7 @@
6666

6767
protected override OpenMdc GetOpenMdcMethod()
6868
{
69-
var logicalThreadContextType = Type.GetType("log4net.LogicalThreadContext, log4net");
69+
var logicalThreadContextType = FindType("log4net.LogicalThreadContext", "log4net");
7070
var propertiesProperty = logicalThreadContextType.GetProperty("Properties");
7171
var logicalThreadContextPropertiesType = propertiesProperty.PropertyType;
7272
var propertiesIndexerProperty = logicalThreadContextPropertiesType.GetProperty("Item");
@@ -103,7 +103,7 @@
103103

104104
private static Type GetLogManagerType()
105105
{
106-
return Type.GetType("log4net.LogManager, log4net");
106+
return FindType("log4net.LogManager", "log4net");
107107
}
108108

109109
private static Func<string, object> GetGetLoggerMethodCall()
@@ -151,7 +151,7 @@
151151
{
152152
try
153153
{
154-
var logEventLevelType = Type.GetType("log4net.Core.Level, log4net");
154+
var logEventLevelType = FindType("log4net.Core.Level", "log4net");
155155
if (logEventLevelType == null) throw new LibLogException("Type log4net.Core.Level was not found.");
156156

157157
var levelFields = logEventLevelType.GetFields().ToList();
@@ -163,7 +163,7 @@
163163
s_levelFatal = levelFields.First(x => x.Name == "Fatal").GetValue(null);
164164

165165
// Func<object, object, bool> isEnabledFor = (logger, level) => { return ((log4net.Core.ILogger)logger).IsEnabled(level); }
166-
var loggerType = Type.GetType("log4net.Core.ILogger, log4net");
166+
var loggerType = FindType("log4net.Core.ILogger", "log4net");
167167
if (loggerType == null) throw new LibLogException("Type log4net.Core.ILogger, was not found.");
168168
var instanceParam = Expression.Parameter(typeof(object));
169169
var instanceCast = Expression.Convert(instanceParam, loggerType);
@@ -172,7 +172,7 @@
172172
s_isEnabledForDelegate = GetIsEnabledFor(loggerType, logEventLevelType, instanceCast, levelCast,
173173
instanceParam, levelParam);
174174

175-
var loggingEventType = Type.GetType("log4net.Core.LoggingEvent, log4net");
175+
var loggingEventType = FindType("log4net.Core.LoggingEvent", "log4net");
176176

177177
s_createLoggingEvent = GetCreateLoggingEvent(instanceParam, instanceCast, levelParam, levelCast,
178178
loggingEventType);

src/LibLog/LogProviders/LogProviderBase.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
namespace YourRootNamespace.Logging.LogProviders
22
{
33
using System;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
47
#if LIBLOG_EXCLUDE_CODE_COVERAGE
58
using System.Diagnostics.CodeAnalysis;
69
#endif
@@ -102,5 +105,29 @@ protected virtual OpenMdc GetOpenMdcMethod()
102105
/// <param name="destructure">Determines whether to call the destructor or not.</param>
103106
/// <returns>A disposable that when disposed removes the map from the context.</returns>
104107
protected delegate IDisposable OpenMdc(string key, object value, bool destructure);
108+
109+
/// <summary>
110+
/// Finds a type using a type name and assembly name.
111+
/// </summary>
112+
/// <param name="typeName">The name of the type.</param>
113+
/// <param name="assemblyName">The name of the assembly.</param>
114+
/// <returns>The requested type or null if it was not found.</returns>
115+
protected static Type FindType(string typeName, string assemblyName)
116+
{
117+
return FindType(typeName, new[] {assemblyName});
118+
}
119+
120+
/// <summary>
121+
/// Finds a type using a type name and a list of assembly names to search.
122+
/// </summary>
123+
/// <param name="typeName">The name of the type.</param>
124+
/// <param name="assemblyNames">A list of assembly names to search.</param>
125+
/// <returns>The request type or null if it was not found.</returns>
126+
protected static Type FindType(string typeName, IReadOnlyList<string> assemblyNames)
127+
{
128+
return assemblyNames
129+
.Select(assemblyName => Type.GetType($"{typeName}, {assemblyName}"))
130+
.FirstOrDefault(type => type != null) ?? Type.GetType(typeName);
131+
}
105132
}
106133
}

src/LibLog/LogProviders/LogProviderBase.cs.pp

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,17 @@
33
namespace $rootnamespace$.Logging.LogProviders
44
{
55
using System;
6+
using System.Collections.Generic;
7+
using System.Linq;
8+
9+
#if LIBLOG_EXCLUDE_CODE_COVERAGE
10+
using System.Diagnostics.CodeAnalysis;
11+
#endif
612

713
/// <summary>
814
/// Base class for specific log providers.
915
/// </summary>
1016
#if LIBLOG_EXCLUDE_CODE_COVERAGE
11-
using System.Diagnostics.CodeAnalysis;
12-
1317
[ExcludeFromCodeCoverage]
1418
#endif
1519
#if LIBLOG_PUBLIC
@@ -103,5 +107,29 @@
103107
/// <param name="destructure">Determines whether to call the destructor or not.</param>
104108
/// <returns>A disposable that when disposed removes the map from the context.</returns>
105109
protected delegate IDisposable OpenMdc(string key, object value, bool destructure);
110+
111+
/// <summary>
112+
/// Finds a type using a type name and assembly name.
113+
/// </summary>
114+
/// <param name="typeName">The name of the type.</param>
115+
/// <param name="assemblyName">The name of the assembly.</param>
116+
/// <returns>The requested type or null if it was not found.</returns>
117+
protected static Type FindType(string typeName, string assemblyName)
118+
{
119+
return FindType(typeName, new[] {assemblyName});
120+
}
121+
122+
/// <summary>
123+
/// Finds a type using a type name and a list of assembly names to search.
124+
/// </summary>
125+
/// <param name="typeName">The name of the type.</param>
126+
/// <param name="assemblyNames">A list of assembly names to search.</param>
127+
/// <returns>The request type or null if it was not found.</returns>
128+
protected static Type FindType(string typeName, IReadOnlyList<string> assemblyNames)
129+
{
130+
return assemblyNames
131+
.Select(assemblyName => Type.GetType($"{typeName}, {assemblyName}"))
132+
.FirstOrDefault(type => type != null) ?? Type.GetType(typeName);
133+
}
106134
}
107135
}

src/LibLog/LogProviders/LoupeLogProvidercs.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public static bool IsLoggerAvailable()
5757

5858
private static Type GetTypeFromCoreOrFrameworkDll(string typeName)
5959
{
60-
return Type.GetType($"{typeName}, {LoupeAgentNetCoreDll}") ?? Type.GetType($"{typeName}, {LoupeAgentNetFrameworkDll}");
60+
return FindType(typeName, new[] {LoupeAgentNetCoreDll, LoupeAgentNetFrameworkDll});
6161
}
6262

6363
private static Type GetLogManagerType()

src/LibLog/LogProviders/LoupeLogProvidercs.cs.pp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959

6060
private static Type GetTypeFromCoreOrFrameworkDll(string typeName)
6161
{
62-
return Type.GetType($"{typeName}, {LoupeAgentNetCoreDll}") ?? Type.GetType($"{typeName}, {LoupeAgentNetFrameworkDll}");
62+
return FindType(typeName, new[] {LoupeAgentNetCoreDll, LoupeAgentNetFrameworkDll});
6363
}
6464

6565
private static Type GetLogManagerType()

src/LibLog/LogProviders/NLogLogProvider.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ protected override OpenNdc GetOpenNdcMethod()
4242
{
4343
var messageParam = Expression.Parameter(typeof(string), "message");
4444

45-
var ndlcContextType = Type.GetType("NLog.NestedDiagnosticsLogicalContext, NLog");
45+
var ndlcContextType = FindType("NLog.NestedDiagnosticsLogicalContext", "NLog");
4646
if (ndlcContextType != null)
4747
{
4848
var pushObjectMethod = ndlcContextType.GetMethod("PushObject", typeof(object));
@@ -53,7 +53,7 @@ protected override OpenNdc GetOpenNdcMethod()
5353
}
5454
}
5555

56-
var ndcContextType = Type.GetType("NLog.NestedDiagnosticsContext, NLog");
56+
var ndcContextType = FindType("NLog.NestedDiagnosticsContext", "NLog");
5757
var pushMethod = ndcContextType.GetMethod("Push", typeof(string));
5858

5959
var pushMethodCall = Expression.Call(null, pushMethod, messageParam);
@@ -64,13 +64,13 @@ protected override OpenMdc GetOpenMdcMethod()
6464
{
6565
var keyParam = Expression.Parameter(typeof(string), "key");
6666

67-
var ndlcContextType = Type.GetType("NLog.NestedDiagnosticsLogicalContext, NLog");
67+
var ndlcContextType = FindType("NLog.NestedDiagnosticsLogicalContext", "NLog");
6868
if (ndlcContextType != null)
6969
{
7070
var pushObjectMethod = ndlcContextType.GetMethod("PushObject", typeof(object));
7171
if (pushObjectMethod != null)
7272
{
73-
var mdlcContextType = Type.GetType("NLog.MappedDiagnosticsLogicalContext, NLog");
73+
var mdlcContextType = FindType("NLog.MappedDiagnosticsLogicalContext", "NLog");
7474
if (mdlcContextType != null)
7575
{
7676
var setScopedMethod = mdlcContextType.GetMethod("SetScoped", typeof(string), typeof(object));
@@ -85,7 +85,7 @@ protected override OpenMdc GetOpenMdcMethod()
8585
}
8686
}
8787

88-
var mdcContextType = Type.GetType("NLog.MappedDiagnosticsContext, NLog");
88+
var mdcContextType = FindType("NLog.MappedDiagnosticsContext", "NLog");
8989
var setMethod = mdcContextType.GetMethod("Set", typeof(string), typeof(string));
9090
var removeMethod = mdcContextType.GetMethod("Remove", typeof(string));
9191
var valueParam = Expression.Parameter(typeof(string), "value");
@@ -108,7 +108,7 @@ protected override OpenMdc GetOpenMdcMethod()
108108

109109
private static Type GetLogManagerType()
110110
{
111-
return Type.GetType("NLog.LogManager, NLog");
111+
return FindType("NLog.LogManager", "NLog");
112112
}
113113

114114
private static Func<string, object> GetGetLoggerMethodCall()
@@ -194,7 +194,7 @@ internal NLogLogger(object logger)
194194

195195
_nameDelegate = (NameDelegate)loggerType.GetProperty("Name").GetGetMethod().CreateDelegate(typeof(NameDelegate), logger);
196196

197-
var logEventInfoType = Type.GetType("NLog.LogEventInfo, NLog");
197+
var logEventInfoType = FindType("NLog.LogEventInfo", "NLog");
198198
_logEventDelegate = (type, e) => loggerType.GetMethod("Log", new Type[] { typeof(Type), logEventInfoType }).Invoke(logger, new object[] { type, e });
199199

200200
_isTraceEnabledDelegate = GetIsEnabledDelegate(logger, "IsTraceEnabled");
@@ -223,7 +223,7 @@ private static bool Initialize()
223223
{
224224
try
225225
{
226-
var logEventLevelType = Type.GetType("NLog.LogLevel, NLog");
226+
var logEventLevelType = FindType("NLog.LogLevel", "NLog");
227227
if (logEventLevelType == null) throw new LibLogException("Type NLog.LogLevel was not found.");
228228

229229
var levelFields = logEventLevelType.GetFields().ToList();
@@ -234,7 +234,7 @@ private static bool Initialize()
234234
s_levelError = levelFields.First(x => x.Name == "Error").GetValue(null);
235235
s_levelFatal = levelFields.First(x => x.Name == "Fatal").GetValue(null);
236236

237-
var logEventInfoType = Type.GetType("NLog.LogEventInfo, NLog");
237+
var logEventInfoType = FindType("NLog.LogEventInfo", "NLog");
238238
if (logEventInfoType == null) throw new LibLogException("Type NLog.LogEventInfo was not found.");
239239

240240
var loggingEventConstructor =
@@ -474,7 +474,7 @@ private object TranslateLevel(LogLevel logLevel)
474474

475475
private static bool IsStructuredLoggingEnabled()
476476
{
477-
var configFactoryType = Type.GetType("NLog.Config.ConfigurationItemFactory, NLog");
477+
var configFactoryType = FindType("NLog.Config.ConfigurationItemFactory", "NLog");
478478
if (configFactoryType != null)
479479
{
480480
var parseMessagesProperty = configFactoryType.GetProperty("ParseMessageTemplates");

0 commit comments

Comments
 (0)