C# 使用AssemblyInfo.cs及其背后的机制设置其他程序集的属性

C# 使用AssemblyInfo.cs及其背后的机制设置其他程序集的属性,c#,.net,C#,.net,我一直在努力让log4net在一个客户机的演示程序中工作,这样他们就可以将其与代码库集成。我在执行时发现了这篇文章 所描述的步骤之一是 步骤2:在AssemblyInfo.cs文件中添加以下行 当我将这行代码添加到AssemblyInfo.cs时,记录器就开始工作了 我在谷歌上搜索了一下,试图了解为什么需要这一行,大多数文档和注释都声称AssemblyInfo是用于可选配置信息的。我不明白为什么添加这一行会使我的程序工作; 我的关键问题是 -AssemblyInfo.cs中的配置信息是如何获取和

我一直在努力让log4net在一个客户机的演示程序中工作,这样他们就可以将其与代码库集成。我在执行时发现了这篇文章 所描述的步骤之一是

步骤2:在AssemblyInfo.cs文件中添加以下行

当我将这行代码添加到AssemblyInfo.cs时,记录器就开始工作了

我在谷歌上搜索了一下,试图了解为什么需要这一行,大多数文档和注释都声称AssemblyInfo是用于可选配置信息的。我不明白为什么添加这一行会使我的程序工作; 我的关键问题是 -AssemblyInfo.cs中的配置信息是如何获取和使用的(是否有一些文档对此进行了清楚的描述) -log4net是如何“知道”从AssemblyInfo.cs获取该信息的


据我所知,这些是程序集上的属性,而不是其背后的机制。

Log4net的代码在调用程序集中查找程序集级别的
XmlConfigurator
属性


它读取找到的属性的属性,并对其自身进行适当配置。

Nice topic。我不能提供一个链接,正如你所问的,只有几点,调查结果。我的一些陈述是显而易见的。我想把它们放在一起,放在一个地方。并给出log4Net设置的魔法是如何触发的

  • AssemblyInfo.cs是一个“普通”文件,与任何其他.cs文件一样,包含例如C#类定义。在项目文件中,它被标记为“编译”。 换句话说,这是一个按照约定选择的位置,所有“assembly”属性都应该放置在这里。但它们可以(但不应该)在任何地方(如果放在任何项目编译文件的特定名称空间声明之外)
  • 如果标记为[AttributeUsage(AttributeTargets.assembly)],则任何自定义属性,如log4Net“XmlConfiguratorAttribute”都可以添加到程序集定义中
  • 所有属性都只是一个元信息。换句话说,它们是可用的(用于反射),但不是隐式使用的。默认情况下不执行
  • (某些属性,如AssemblyVersion、AssemblyTitle似乎已执行,但它是编译器指定的显式调用)
考虑到这一点,我们可以对属性做些什么。我们的(自定义)代码可以使用反射来检查是否存在属性,大多数属性是特定的已知类型(例如XmlConfiguratorAttribute)。如果这样的属性存在,我们可以“执行”它。例如我使用的ASP.NET MVC有其“运行时”,它授予IFilter类型的任何属性都将正确执行。它是MVC运行时,观察类和方法并显式执行这些属性

AssemblyInfo.cs中单独声明的属性声明是不够的。与上面声明XmlConfiguration的代码段一样。通常会有其他一些调用(在ASP.NET中,可能在Global.asax中)构造ILog

ILog logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
在方法调用链的某个地方,Log4Net内部将检查是否存在:

var attributes = Attribute.GetCustomAttributes(thisAssembly, typeof(XmlConfiguratorAttribute));

如果是(assembly有这样的属性)-log4Net可以使用它,强制它完成它的工作(例如,从xml配置自己)

另一方面,assembly级别的属性不是配置log4Net的唯一方法:@roken这也很有趣,我将检查outhi@SLaks是否只回答了我的部分问题,您能否提供更多关于AssemblyInfo.cs的详细信息或链接,解释其工作原理?Hi@Radim感谢您的全面回答。它包括一件特别有趣的事情;assembly指令不必包含在AssemblyInfo.cs中,并且该文件仅根据约定是特殊的。我测试了将指令移动到另一个配置记录器的.cs文件中,这也很好。(当然,我不会把代码留在那里:))
var attributes = Attribute.GetCustomAttributes(thisAssembly, typeof(XmlConfiguratorAttribute));