我为我的 log4net 日志对象的初始化创建了一个包装类,以便更容易在 ThreadContext 中建立自定义属性。这发生在我与许多其他有用函数一起建立的类库中。为了加入所有各种库,我还使用“/internalize”开关向 ILMerge 添加了 AfterBuild 目标。
ILMerge 所针对的库中对这个初始化方法的所有引用似乎都可以正常工作。但是,当我在其他地方引用这个合并的库时。我的实现引发了保护级别错误。我尝试将各种内容添加到可选的排除 (/internalize:excludes.txt) 文件中,但这似乎不起作用。
示例 excludes.txt:
log4net.Config
log4net.ThreadContext
log4net.LogManager
其他人遇到过这个问题吗?
[编辑]:
这是代码:
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace Logging
{
public static class Log4NetThreadContext
{
public static ILog Initialize(Type declaringType)
{
// Read from configuration
XmlConfigurator.Configure();
// Set Properties
ThreadContext.Properties["ID"] = ...
...
...
...
if(System.Diagnostics.Debugger.IsAttached)
{
// Special debugging logger
return LogManager.GetLogger("DEBUG_MODE");
}
else
{
// Root logger
return LogManager.GetLogger(declaringType);
}
}
}
}
我正在像这样使用这段代码..
private static readonly Type declaringType =
MethodBase.GetCurrentMethod().DeclaringType;
private static readonly ILog log =
Log4NetThreadContext.Initialize(declaringType);
...
log.Info("Something useful");
[编辑]:
这是我的 AfterBuild 目标
<Target Name="AfterBuild">
<CreateItem Include="@(ReferenceCopyLocalPaths)" Condition="'%(Extension)'=='.dll'">
<Output ItemName="AssembliesToMerge" TaskParameter="Include" />
</CreateItem>
<Message Text="MERGING: @(AssembliesToMerge->'%(Filename)')" Importance="High" />
<Exec Command=""$(ProgramFiles)\Microsoft\Ilmerge\Ilmerge.exe" /targetplatform:v2 /log /internalize:"ilmerge.excludes.txt" /keyfile:$(AssemblyOriginatorKeyFile) /out:@(MainAssembly) "@(IntermediateAssembly)" @(AssembliesToMerge->'"%(FullPath)"', ' ')" />
<Delete Files="@(ReferenceCopyLocalPaths->'$(OutDir)%(DestinationSubDirectory)%(Filename)%(Extension)')" />
一般来说,是否有更好的方法来调试保护级别问题?
Log4NetThreadContext.Initialize(System.Type)' is inaccessible due to its protection level