我发现在VS2008向导生成的类库中没有看到app.config文件。经过我的研究,我发现应用程序只存在一个app.config文件。
在类库中手动添加app.config文件是不好的事情吗?还是有其他方法可以满足类库中需要app.config的目的?
我需要将log4net配置信息存储在app.config文件中。
我发现在VS2008向导生成的类库中没有看到app.config文件。经过我的研究,我发现应用程序只存在一个app.config文件。
在类库中手动添加app.config文件是不好的事情吗?还是有其他方法可以满足类库中需要app.config的目的?
我需要将log4net配置信息存储在app.config文件中。
一般来说,你不应该将app.config
文件添加到类库项目中,因为它需要一些困难的弯曲和扭曲才能使用。这不会对库项目造成任何影响——它只是根本不会起作用。
相反,你应该配置使用你的库的应用程序;所以所需的配置信息应该在那里设置。每个可能使用你的库的应用程序可能有不同的要求,所以这实际上也是有逻辑意义的。
我不知道为什么还没有人提供这个答案:
同一个库的不同调用者通常会使用不同的配置。这意味着配置必须驻留在可执行应用程序中,而不是类库中。
您可以在类库项目中创建一个 app.config 文件。它将包含您在库中创建的项目的默认配置。例如,如果您在类库中创建了一个 Entity Framework 模型,则它将包含连接字符串。
然而,可执行应用程序调用库时将不会使用这些设置。相反,这些设置可能会从 library.dll.config 文件复制到调用者的 app.config 或 web.config 中,以便它们可以被更改为特定于调用者和被部署到的环境。
这就是 .NET 从第一天开始的工作方式。
Jon,很多人提供的意见没有正确回答你的问题。
我会给出我的看法,然后告诉你如何做到正好符合你的要求。
我认为一个程序集为什么不能有自己的配置文件呢?为什么原子性的第一层应该在应用程序级别而不是解决方案级别?这是一个随意的、最佳猜测的决定,也就是个人意见。如果你要编写一个日志记录库,并想包含一个全局使用的配置文件,为什么不能利用内置的设置功能?我们都做过这样的事情……试图为其他开发人员提供“强大”的功能。怎么做呢?通过做出本质上转化为限制的假设。这正是微软在设置框架中所做的,所以你必须“骗一下”它。
直接回答你的问题,只需手动添加配置文件(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 条目。
实际上,您正在实现的类库是从使用它的应用程序中的app.config检索信息,因此,在VS中为.NET实现类库配置的最正确方法是在应用程序中准备app.config 来配置它所消耗的所有内容,如库配置。
我有一点使用log4net的经验,我发现准备应用程序的人总是在主app.config 中拥有一个log4net配置部分。
例如这个配置有一个log4net 部分。
app.config
是从最终运行的实际程序加载的...而不是单独的类库。很多人不知道这个非常基本的事实,实际上有点令人困惑。 - Andrew Barberpublic 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;
}
public static void getLog(string className, string message)
{
log4net.ILog iLOG = LogManager.GetLogger(className);
iLOG.Error(message); // Info, Fatal, Warn, Debug
}
实际上,在一些罕见情况下,您可以将app.config存储在类库中(通过手动添加),并使用OpenExeConfiguration进行解析。
var fileMap =
new ExeConfigurationFileMap {ExeConfigFilename =
@"C:\..somePath..\someName.config"};
System.Configuration.Configuration config =
ConfigurationManager.OpenMappedExeConfiguration(fileMap,
ConfigurationUserLevel.None);
您应该真正估计这个的实际需求。对于抽象数据来说,这不是最好的解决方案,但“配置部分”可能非常有用!
例如,我们通过使用基于通道工厂T的Unity容器和注入工厂,将我们的N-Tier WCF架构解耦,没有任何元数据。我们添加了外部ClassLibrary dll,仅带有[Service Contract]接口和通用app.config,在客户端部分中读取端点,并轻松地在一个地方添加/更改。
TraceSource
,但是如果我没有在测试类库中添加包含跟踪/日志配置的App.config文件,则运行测试时不会记录任何内容。 <configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="ClassLibrary.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<applicationSettings>
<ClassLibrary.Properties.Settings>
<setting name="Setting1" serializeAs="String">
<value>3</value>
</setting>
</BookOneGenerator.Properties.Settings>
</applicationSettings>
[ApplicationScopedSetting]
[DebuggerNonUserCode]
[DefaultSettingValue("3")]
public string Setting1
{
get
{
return (string)this["Setting1"];
}
}
当您将类库项目添加到解决方案中时,不会自动添加app.config文件。
据我所知,手动添加没有任何反对意见。我认为这是一种常见用法。
关于log4Net配置,您不必将配置放入app.config中,您可以在项目中拥有一个专用的conf文件以及同时存在一个app.config文件。
此链接http://logging.apache.org/log4net/release/manual/configuration.html将为您提供两种方式的示例(在app.config中的部分和独立的log4net conf文件)
app.config
不会有任何影响,但也不会被使用。 - Andrew Barbervar cs= Properties.Settings.Default.[<name of defined setting>];