app.config用于类库

时间:2011-04-15 09:42:58

标签: c# visual-studio-2008 configuration log4net class-library

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

将app.config手动添加到类库中是不是一件坏事,还是有其他方法可以满足类库中app.config的用途?

我需要在app.config文件中存储log4net配置信息。

10 个答案:

答案 0 :(得分:81)

您通常app.config文件添加到类库项目中;没有一些痛苦的弯曲和扭曲你将不会使用它。它完全没有伤害图书馆项目 - 它根本不会做任何事情。

而是配置使用您的库的应用程序;所以所需的配置信息会去那里。可能使用您的库的每个应用程序可能会有不同的要求,因此这实际上也具有逻辑意义。

答案 1 :(得分:42)

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

同一个库的不同调用者通常会使用不同的配置。这意味着配置必须位于可执行文件应用程序中,而不是位于类库中。

您可以在类库项目中创建app.config。它将包含您在库中创建的项目的默认配置。例如,如果在类库中创建实体框架模型,它将包含连接字符串。

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

这是第1天以来.NET的用法。

答案 2 :(得分:35)

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

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

我认为没有理由为什么程序集不能拥有自己的配置文件。为什么第一级的atomicy(是真正的单词?)在应用程序级别?为什么不在解决方案级别?这是一个任意的,最佳猜测的决定,因此,一个意见。如果你要编写一个日志库并希望为它包含一个配置文件,那么它将全局使用,为什么你不能挂入内置设置功能?我们都做到了......试图为其他开发者提供“强大”的功能。怎么样?通过做出本质上转化为限制的假设。这正是MS对设置框架所做的,所以你必须“愚弄”一点。

要直接回答您的问题,只需手动添加配置文件(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层次结构。换句话说,如果设置不存在,它将解决更高的问题。设置也将覆盖machine.config条目。

答案 3 :(得分:6)

如果要使用log4Net配置项目日志记录,在使用类库时,实际上不需要任何配置文件。您可以在类中配置log4net记录器,并可以将该类用作库。

由于log4net提供了配置它的所有选项。

请找到以下代码。

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所需的路径和模式来设置Global.asax应用程序启动函数中的记录器。

使用以下代码记录错误。

        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内写一行。

答案 4 :(得分:4)

实际上,您正在实现的类库是从正在使用它的应用程序中的 app.config 中检索信息,因此,在.net上实现类库配置的最正确方法在VS中,要在应用程序中准备 app.config 以配置它所消耗的所有内容,例如库配置。

我已经使用了log4net,我发现准备应用程序的人总是在主 app.config 中有一个用于log4net配置的部分。

我希望您发现此信息有用。

见到你,发表关于你找到的解决方案的评论。

修改

在下一个链接中,您有一个 app.config ,其中包含log4net部分:

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

答案 5 :(得分:4)

实际上,对于一些罕见的情况,您可以在类库中存储app.config(通过手动添加)并按OpenExeConfiguration解析。

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

你应该真正估计这个的真正需要。对于抽象数据,它不是最好的解决方案,但是" Config Sections"可能非常有用!!

例如,我们组织了N-Tier WCF架构,在没有任何元数据的情况下,仅使用基于Channel Factory T的Unity Container和Injection Factory进行了解耦。我们添加了外部ClassLibrary dll,只有[Service Contract]接口和常用应用程序。 config以便从clientsection读取端点,并在一个地方轻松添加/更改它们。

答案 6 :(得分:3)

如果您正在使用跟踪器/记录器,则需要将 App.config 添加到 tests 类库中。 当您通过TestDriven.Net等测试运行器运行测试时,不会记录任何内容

例如,我在我的程序中使用TraceSource,但运行测试并不记录任何内容,除非我将带有跟踪/日志配置的 App.config 文件添加到测试类库。

否则,将 App.config 添加到类库中并没有做任何事情。

答案 7 :(得分:1)

向解决方案添加类库项目时,不会自动添加app.config文件。

据我所知,没有关于这样做的反指示。我认为这是一种常见的用法。

关于log4Net配置,您不必将配置放入app.config,您可以在项目中同时拥有专用的conf文件以及app.config文件。

此链接http://logging.apache.org/log4net/release/manual/configuration.html将为您提供有关这两种方式的示例(app.config中的部分和独立的log4net conf文件)

答案 8 :(得分:1)

对于非手动创建app.config的答案是Visual Studio项目“属性/设置”选项卡。

添加设置并保存后,将自动创建app.config。 此时,将在{ yourclasslibrary .Properties}命名空间中生成一堆代码,其中包含与您的设置相对应的属性。这些设置本身将放置在app.config的applicationSettings设置中。

 <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>

如果您添加了一个名为Setting1 = 3的应用程序范围设置,那么将创建一个名为Setting1的属性。 这些属性已成为二进制文件的编译部分,并用 DefaultSettingValueAttribute 装饰,该属性设置为在开发时指定的值。

     [ApplicationScopedSetting]
    [DebuggerNonUserCode]
    [DefaultSettingValue("3")]
    public string Setting1
    {
        get
        {
            return (string)this["Setting1"];
        }
    }

因此,如在类库代码中一样,如果运行时配置文件中不存在相应的设置,则您将使用这些属性,它将回退以使用默认值。这样一来,应用程序就不会因为缺少设置项而崩溃,这在您不知道这些工作原理时第一次使您非常困惑。 现在,您在问自己如何在已部署的库中指定我们自己的新值,并避免使用默认设置值?

当我们正确配置可执行文件的app.config时,就会发生这种情况。两步。 1.我们意识到我们将拥有该类库的设置部分,并且2.进行了少量修改后,将类库的配置文件粘贴到了可执行文件config中。 (有一种方法可以将类库配置文件保留在外部,而您只需从可执行文件的配置中引用它即可。

因此,您可以为类库提供一个app.config,但是如果您未将其与父应用程序正确集成,则它是无用的。 请看这里我前一段时间写的内容:link

答案 9 :(得分:0)

我建议使用Properties.Settings将诸如ConnectionStrings之类的值存储在类库中。例如,当您尝试添加表适配器时,Visual Studio会根据建议在此处存储所有连接字符串。 enter image description here

然后可以通过在clas库中的每个位置使用此代码来访问它们

var cs=  Properties.Settings.Default.[<name of defined setting>];