App.config中的类库

本文关键字:类库 config App | 更新日期: 2023-09-27 17:50:11

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

手动添加app.config到类库是一件坏事,还是有其他方法可以在类库中实现app.config的目的?

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

App.config中的类库

您通常不应该app.config文件添加到类库项目中;如果没有痛苦的弯曲和扭曲,你是不会使用它的。根本不会影响库项目——它根本不会做任何事情。

相反,你配置正在使用你的库的应用程序;所以需要的构型信息在这里。每个可能使用您的库的应用程序都可能有不同的需求,因此这实际上也是合乎逻辑的。

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

同一标准库的不同调用者通常使用不同的配置。这意味着配置必须驻留在可执行应用程序中,而不是在类库中。

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

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

这就是。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;

注意这完全支持机器。配置层次结构,即使您已经明确选择了应用程序配置文件。换句话说,如果设置不存在,它的分辨率会更高。设置也将覆盖机器。配置条目。

实际上,您正在实现的类库正在从app检索信息。在使用它的应用程序中配置,因此,在VS中实现。net类库配置的最正确方法是准备app。在应用程序中配置来配置它所使用的一切,比如库配置。

我对log4net做了一点工作,我发现准备应用程序的人总是在main app.config中有一个log4net配置部分。

例如,这个配置有一个log4net节。

如果您想使用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(new 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中编写一行。

实际上,在某些罕见的情况下,您可以将app.config存储在类库中(通过手动添加)并通过openexecconfiguration解析它。

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

你应该真正估计一下这个的真正需求。对于抽象数据,这不是最好的解决方案,但"配置分段";可能会非常有用!!

例如,我们组织我们的n层WCF架构解耦,没有任何元数据,只是通过使用Unity容器和基于通道工厂t的注入工厂。我们添加了外部ClassLibrary dll,只有[服务契约]接口和通用的app.config,以便从clientsection读取端点,并轻松地在一个地方添加/更改它们。

你确实想添加App。如果使用跟踪器/日志记录器,则将配置到tests类库。否则,当您通过测试运行器(如TestDriven.Net)运行测试时,没有记录

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

否则,添加App。配置到类库不会做任何事情。

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

当你添加设置并保存时,你的app.config将自动创建。此时,在{yourclasslibrary中生成了一堆代码。属性}命名空间,其中包含与您的设置相对应的属性。设置本身将放在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。稍加修改,我们将类库的配置文件粘贴到可执行配置文件中。(有一个方法,你可以保持类库配置文件外部,你只是从可执行文件的配置引用它。

所以,你可以有一个app.config类库,但它是无用的,如果你没有正确地集成它与父应用程序。链接

当你添加一个类库项目到你的解决方案中时,不会自动添加app.config文件。

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

关于log4Net配置,你不需要把配置放到app.config中,你可以在你的项目中同时有一个专用的配置文件和app.config文件。

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

我建议使用属性。在类库中存储ConnectionStrings等值的设置。当您尝试添加表适配器时,这是根据visual studio的建议存储所有连接字符串的地方。输入图片描述

然后在类库

的任何地方都可以使用这些代码访问它们
var cs=  Properties.Settings.Default.[<name of defined setting>];