app.config用于类库

log*_*eks 69 c# configuration log4net class-library visual-studio-2008

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

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

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

And*_*ber 86

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

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

  • 对你有益.不过,我没有回答你的问题.你显然有某种本土配置系统,不适用于在这里提问的人. (22认同)
  • 想出来......如果使用NUnit,请将您的app.config文件命名为*.nunit项目文件名.例如,如果您调用项目"ClassLibraryA.nunit",则将类库配置文件命名为"ClassLibraryA.config".它们还需要驻留在同一文件夹/目录中.NUnit实际上是使用它作为主配置文件....添加对System.Configuration的引用(在.NET选项卡中)....并使用此代码:string settingValue = ConfigurationManager.AppSettings ["settingName"]; (3认同)
  • 我有一个 Selenium WebDriver 类库,我从 NUnit 为我的所有测试用例运行它。我不想担心在 NUnit 中设置配置。我该如何弯曲和扭转才能完成这项工作?:-) (2认同)
  • 在进行集成测试时,您会如何建议进行设置?对我来说,在该测试库中使用连接字符串创建app.config似乎是合乎逻辑的. (2认同)
  • 如果由于您不拥有应用程序而无法配置应用程序,该怎么办? (2认同)

Joh*_*ers 46

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

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

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

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

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

  • @John Saunders:"可能需要"是正确的话.因此,可能存在配置设置仅在每个服务器(例如连接字符串)上不同的情况,并且让dll拥有它自己的配置比为每个使用dll的程序集复制很多次更方便.在我看来,微软/ .NET的首选用法不是圣杯.这实际上取决于部署方案中最方便的内容.没有必要告诉Todd,他的意见和你的一样重要或者微软. (4认同)
  • 但是如果我需要从类库中调用 webserice 功能,我该怎么办?VS 创建了一个默认的 app.config 但我的应用程序在尝试调用 webservice 函数时崩溃了 - 它找不到配置条目... (2认同)

小智 37

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

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

我认为没有理由为什么程序集不能拥有自己的配置文件.为什么第一级atomof(真正的单词?)是在应用程序级别?为什么不在解决方案级别?这是一个任意的,最佳猜测的决定,因此,一个意见.如果你要编写一个日志库并希望为它包含一个配置文件,那么它将全局使用,为什么你不能挂入内置设置功能?我们都做到了......试图为其他开发者提供"强大"的功能.怎么样?通过做出本质上转化为限制的假设.这正是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;
Run Code Online (Sandbox Code Playgroud)

请注意,即使您已明确选择了应用程序配置文件,这也完全支持machine.config层次结构.换句话说,如果设置不存在,它将解决更高的问题.设置还将覆盖machine.config条目.

  • @JohnSaunders"库的不同调用者可能需要不同的配置." 确切地说,它们"可能"需要不同的配置,并且在配置依赖于调用者的所有情况下,您的逻辑都非常有意义.但是有几种情况下,配置在内部用于类库,并且配置完全相同,无论调用者是什么.如果您有10个应用程序正在使用库,则必须将完全相同的配置复制并粘贴到10个配置文件中. (13认同)
  • -1:您的意见本身并不重要.事实很重要.从第1天开始,.NET已创建,以便库的调用者确定库中项目的配置.这是配置真正意义上的唯一因素,因为库的不同调用者可能需要不同的配置. (3认同)
  • @ToddBeaulieu:我认为你想要的词是'原子性'. (3认同)
  • 在插件架构中,如果所有插件都有自己的配置文件,那确实有意义. (3认同)
  • @RMuesi Noone说它永远不会改变,只是它不依赖于库的调用者.配置可以根据您是否正在调试库与生产版本进行更改.它可以根据您正在构建的环境而变化,等等. (3认同)

Rah*_*hul 7

如果要使用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;
      }
Run Code Online (Sandbox Code Playgroud)

现在,您可以直接使用所需的路径和模式调用SetLogger,而不是调用XmlConfigurator.Configure(新的FileInfo("app.config")),以在Global.asax应用程序启动函数中设置记录器.

并使用以下代码记录错误.

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

通过使用以下代码,您无需在应用程序web.config中或库的app.config内部写入单行.

  • 我觉得这是最好的答案......而不是讨论是否应该允许库使用配置文件......这个答案回答了 OP 使用 Log4net 的问题 (2认同)
  • 尽管问题使用 log4net 作为示例,但实际问题通常是关于配置的。我想说关于 log4net 的答案实际上是无关紧要的。 (2认同)

小智 6

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

我曾有点用log4net的,我发现一个谁编写的应用程序一直对主内log4net的配置的部分的app.config

我希望这个信息对您有所帮助。

待会见,并发表有关找到的解决方案的评论。

编辑:

在下一个链接中,您具有带有log4net部分的app.config

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

  • +1正好;app.config是从最终运行的实际程序中加载的……而不是各个类库。坦率地说,有多少人不知道这个非常基本的事实,这令人有些困惑。 (2认同)