一个类库的app.config

我看不到由VS2008向导为类库生成的app.config文件。 在我的研究中,我发现在应用程序中只存在一个app.config。

将一个app.config手动添加到一个类库或者是否有任何其他方法将用于类库中的app.config的目的是一件坏事吗?

我需要在app.config文件中存储log4netconfiguration信息。

您通常不应该将app.config文件添加到类库项目; 它不会被使用没有一些痛苦的弯曲和扭曲你的一部分。 它根本不会损害图书馆项目 – 它根本不会做任何事情。

相反,你configuration正在使用你的库的应用程序; 所以需要的configuration信息会去那里。 每个可能使用你的库的应用程序可能会有不同的要求,所以这实际上也是合乎逻辑的。

我不知道为什么这个答案还没有给出:

一般来说,同一个库的不同调用者将使用不同的configuration。 这意味着configuration必须驻留在可执行应用程序中,而不是驻留在类库中。

您可以在类库项目中创build一个app.config。 它将包含您在库中创build的项目的默认configuration。 例如,如果您在类库中创buildentity framework模型,它将包含连接string。

但是,这些设置不会被调用库的可执行应用程序使用。 相反,可以将这些设置从library.dll.config文件复制到调用程序的app.config或web.config中,以便可以将它们更改为调用程序特定的以及调用程序所在的环境部署。

从第1天开始,.NET就是这样的。

Jon,很多意见都没有正确回答你的问题。

我会给我的意见,然后告诉你如何做到你所要求的。

我没有看到程序集没有自己的configuration文件的原因。 为什么atomicy的第一级(是一个真正的单词?)在应用程序级别? 为什么不在解决scheme层面? 这是一个任意的,猜测最好的决定,因此,一个意见。 如果您要编写一个日志logging库,并希望为其包含一个configuration文件,那么这个文件将在全球范围内使用,为什么您不能进入内置设置function? 我们都做到了这一点…试图为其他开发者提供“强大”的function。 怎么样? 通过使固有的假设转化为限制。 这正是MS在设置框架中所做的,所以你不得不“愚弄它”一点。

要直接回答您的问题,只需手动添加configuration文件(xml)并将其命名为符合您的库,并包含“config”扩展名。 例:

MyDomain.Mylibrary.dll.Config

接下来,使用ConfigurationManager加载文件和访问设置:

 string assemblyPath = new Uri(Assembly.GetExecutingAssembly().CodeBase).AbsolutePath; Configuration cfg = ConfigurationManager.OpenExeConfiguration(assemblyPath); string result = cfg.AppSettings.Settings["TEST_SETTING"].Value; 

请注意,这完全支持machine.config层次结构,即使您明确select了应用程序configuration文件。 换句话说,如果设置不存在,则会解决更高。 设置也将覆盖machine.config条目。

如果你想使用log4Netconfiguration你的项目日志logging,那么在使用类库的时候,不需要任何configuration文件。 您可以在一个类中configuration您的log4netlogging器,并可以使用该类作为库。

由于log4net提供了所有的configuration选项。

请find下面的代码。

 public static void SetLogger(string pathName, string pattern) { Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository(); PatternLayout patternLayout = new PatternLayout(); patternLayout.ConversionPattern = pattern; patternLayout.ActivateOptions(); RollingFileAppender roller = new RollingFileAppender(); roller.AppendToFile = false; roller.File = pathName; roller.Layout = patternLayout; roller.MaxSizeRollBackups = 5; roller.MaximumFileSize = "1GB"; roller.RollingStyle = RollingFileAppender.RollingMode.Size; roller.StaticLogFileName = true; roller.ActivateOptions(); hierarchy.Root.AddAppender(roller); MemoryAppender memory = new MemoryAppender(); memory.ActivateOptions(); hierarchy.Root.AddAppender(memory); hierarchy.Root.Level = log4net.Core.Level.Info; hierarchy.Configured = true; } 

现在不用调用XmlConfigurator.Configure(新的FileInfo(“app.config”)),你可以直接调用SetLogger所需的path和模式来设置Global.asax应用程序启动函数中的logging器。

并使用下面的代码来logging错误。

  public static void getLog(string className, string message) { log4net.ILog iLOG = LogManager.GetLogger(className); iLOG.Error(message); // Info, Fatal, Warn, Debug } 

通过使用下面的代码,您不需要在应用程序web.config中或者在库的app.config中写一行。

实际上,你正在实现的类库是从正在使用它的应用程序中的app.config中检索信息,因此,在VS中.net中为类库实现configuration的最正确的方法是准备app.config应用程序来configuration它所消耗的一切,如库configuration。

我已经用log4net做了一些工作,发现准备应用程序的人总是在主app.config里面有一个log4netconfiguration部分。

我希望你find这个信息有用。

看到你,并发表有关你find的解决scheme的意见。

编辑:

在下一个链接你有一个app.config log4net部分:

http://weblogs.asp.net/tgraham/archive/2007/03/15/a-realistic-log4net-config.aspx

实际上,对于less数情况,可以在类库中存储app.config(通过手动添加)并通过OpenExeConfigurationparsing。

  var fileMap = new ExeConfigurationFileMap {ExeConfigFilename = @"C:\..somePath..\someName.config"}; System.Configuration.Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); 

你应该真的估计这个真正的需要。 抽象数据不是最好的解决scheme,但“configuration部分”可能是非常有用的!

例如,我们通过使用基于Channel Factory T的Unity Container和Injection Factory,组织了我们的N层WCF体系结构,而不使用任何元数据。我们只用[Service Contract]接口和常见的app.config添加了externall ClassLibrary dll从clientsection读取端点,并轻松地添加/更改它们在一个地方。

将类库项目添加到解决scheme时,不会自动添加app.config文件。

据我所知,没有任何相反的迹象表明这样做是有道理的。 我认为这是一个常见的用法。

关于log4Netconfiguration,你不必把configuration放到app.config中,你可以在你的项目中同时拥有一个专用的configuration文件以及一个app.config文件。

这个链接http://logging.apache.org/log4net/release/manual/configuration.html会给你两种方式的例子(app.config和独立的log4net conf文件中的部分)

如果您使用的是跟踪器/logging器,则您希望将App.config添加到您的testing类库中。 否则,当您通过testing运行器(如TestDriven.Net)运行testing时, 不会logging任何内容

例如,我在我的程序中使用了TraceSource ,但是运行testing不会logging任何东西,除非我将跟踪/日志configuration的App.config文件添加到testing类库中。

否则,将App.config添加到类库不会执行任何操作。