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

时间:2012-10-25 02:58:42

标签: c# .net

我一直在努力让log4net在客户端的演示程序中工作,以便他们可以将它与代码库集成。我在执行http://www.codeproject.com/Articles/14819/How-to-use-log4net时发现了这篇文章 其中一个步骤是

  

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

[assembly: log4net.Config.XmlConfigurator(ConfigFile="Web.config", Watch=true)]   //For log4net 1.2.10.0

一旦我将这行代码添加到我的AssemblyInfo.cs,记录器就开始工作了。

我在这个地方做了一些谷歌搜索,试图理解为什么需要这一行,大多数文档和评论声称AssemblyInfo是用于可选的配置信息。我不明白为什么添加这条线会使我的程序工作; 我的关键问题是 - 如何获取和使用AssemblyInfo.cs中的配置信息(并且有一些文档可以清楚地描述这一点) - log4net如何“知道”从AssemblyInfo.cs中获取该信息?

我从What does the assembly keyword mean in the AssemblyInfo.cs. Does it permit to use method inside?了解到这些是装配上的属性,而不是它背后的机制。

2 个答案:

答案 0 :(得分:1)

好主题。我无法提供一个链接,正如您所要求的那样,只有几点,调查结果。我的一些陈述可能是众所周知的。我想把它们放在一起,放在一个地方。并给出答案如何触发log4Net设置的 magic

  • AssemblyInfo.cs是一个“普通”文件,与任何其他.cs文件一样,包含例如C#定义。在项目文件中,它被标记为“编译”。 换句话说,这是按惯例选择的地方,其中应放置所有“装配”属性。但它们可能是(但不应该)任何地方(如果放在任何项目编译文件中的特定命名空间声明之外)。
  • 如果标记为[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));

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

答案 1 :(得分:0)

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

它读取它找到的属性的属性并适当地自行配置。