ThreadContextでカスタムプロパティを簡単に確立できるようにするために、log4netロギングオブジェクトを初期化するためのラッパークラスを作成しました。これは、他の多くの便利な関数とともに確立したクラスライブラリ内で発生します。さまざまなライブラリのすべてに参加するために、「/internalize」スイッチを使用してAfterBuildターゲットをILMergeに追加しました。
ILMergeの対象となるライブラリ内のこの初期化子メソッドへのすべての参照は、正常に機能しているようです。ただし、このマージされたライブラリを他の場所で参照すると。私の実装は保護レベルのエラーをスローします。オプションのexclude(/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