繁体   English   中英

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

[英]Setting properties of other assemblies using AssemblyInfo.cs and the mechanism behind it

我一直在努力让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中获取该信息?

我理解Assembly关键字在AssemblyInfo.cs中的含义。 它允许在里面使用方法吗? 这些是组件上的属性,但不是它背后的机制。

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

  • 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配置自己)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM