gpt4 book ai didi

c# - 将 ILMerge 与 log4net 一起使用会导致 "inaccessible due to protection level"错误

转载 作者:可可西里 更新时间:2023-11-01 08:11:00 25 4
gpt4 key购买 nike

我为我的 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="&quot;$(ProgramFiles)\Microsoft\Ilmerge\Ilmerge.exe&quot; /targetplatform:v2 /log /internalize:&quot;ilmerge.excludes.txt&quot; /keyfile:$(AssemblyOriginatorKeyFile) /out:@(MainAssembly) &quot;@(IntermediateAssembly)&quot; @(AssembliesToMerge->'&quot;%(FullPath)&quot;', ' ')" />
<Delete Files="@(ReferenceCopyLocalPaths->'$(OutDir)%(DestinationSubDirectory)%(Filename)%(Extension)')" />

一般来说,是否有更好的方法来调试保护级别问题?

Log4NetThreadContext.Initialize(System.Type)' is inaccessible due to its protection level

最佳答案

最终,最简单的做法是将 log4net 完全排除在 ilmerge 进程之外,并将其作为依赖程序集进行维护。

所以在经历了很多折磨之后,这里是“不太明显”的解决方案..

毕竟不需要排除,真正的答案是使用 /lib:[path]在 ilmerge 中切换。

我更新了 AfterBuild目标是从 /internalize 中删除排除项转变。接下来我添加了 /lib switch 将 log4net dll 的位置作为依赖引用传递。它看起来像这样:

<Target Name="AfterBuild">
<CreateItem Include="@(ReferenceCopyLocalPaths)" Condition="'%(Extension)'=='.dll'">
<Output ItemName="AssembliesToMerge" TaskParameter="Include" />
</CreateItem>
<Message Text="MERGING: @(AssembliesToMerge->'%(Filename)')" Importance="High" />
<Exec Command="&quot;$(ProgramFiles)\Microsoft\Ilmerge\Ilmerge.exe&quot; /lib:..\packages\log4net.2.0.0\lib\net35-full\ /targetplatform:v2 /log /internalize /keyfile:$(AssemblyOriginatorKeyFile) /out:@(MainAssembly) &quot;@(IntermediateAssembly)&quot; @(AssembliesToMerge->'&quot;%(FullPath)&quot;', ' ')" />
<Delete Files="@(ReferenceCopyLocalPaths->'$(OutDir)%(DestinationSubDirectory)%(Filename)%(Extension)')" />
</Target>

此外,我还添加了另一个目标,通过添加唯一的 <ILMerge /> 来限制合并中包含的程序集列表。位于我的 .csproj 文件中的引用的元素

<Target Name="AfterResolveReferences">
<Message Text="Filtering out ILMerge assemblies from ReferenceCopyLocalPaths..." Importance="High" />
<ItemGroup>
<ReferenceCopyLocalPaths Remove="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.ILMerge)'=='false'" />
</ItemGroup>
</Target>

因此引用元素被这样列出以适应:

...
<Reference Include="Ionic.Zip">
<HintPath>..\packages\DotNetZip.1.9.1.8\lib\net20\Ionic.Zip.dll</HintPath>
<ILMerge>True</ILMerge>
</Reference>
<Reference Include="log4net">
<HintPath>..\packages\log4net.2.0.0\lib\net35-full\log4net.dll</HintPath>
<ILMerge>False</ILMerge>
...

可能有一个更好的(程序化的)替代方案,可以将 ILMerge=False 值显式添加到 /lib切换,但就我而言,这就足够了,因为只有一个被排除在外的项目。否则,您可能需要手动添加其他路径。

我列出的“AfterResolveReferences”技术归功于 http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamlesslyWithILMergeAndMSBuild.aspx

希望这对某人有帮助!

关于c# - 将 ILMerge 与 log4net 一起使用会导致 "inaccessible due to protection level"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14409010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com