单个 app.config 多项目 c#

Posted

技术标签:

【中文标题】单个 app.config 多项目 c#【英文标题】:single app.config multi-project c# 【发布时间】:2010-11-24 14:49:24 【问题描述】:

我想为 3 个不同的项目使用一个 app.config。

如何访问配置?

ConfigurationManager.AppSettings["config1"]

【问题讨论】:

【参考方案1】:

假设你有这样的文件夹结构:

解决方案 项目1 项目2 项目3

这样做:

    在解决方案级文件夹中创建 App.config 文件。您将找不到从模板中添加 App.config 文件的选项,因此只需创建一个名为 App.config 的新空文本文件,然后粘贴常规 App.config 文件的内容。

    对于解决方案资源管理器中的每个项目:

      右键选择Add > Existing Item 找到文件

      Add 按钮旁边的下拉框中选择Add as link

编辑添加:

您正确地指出,上述方法仅在构建时共享文件。要在运行时使用共享文件,请参阅answers to this question。

【讨论】:

谢谢,我从没想过我可以在解决方案中添加公共项目,以便在所有项目之间共享。但我使用的是 VS2008,找不到“打开方式”链接。加上 app.config 文件不会传播到项目中。 在“添加现有项目”对话框的左下角,有一个“添加”按钮,右侧有一个小下拉指示器 - 单击该指示器,您将获得一个上下文菜单使用“添加”和“添加为链接” - 使用“添加为链接” 感谢marc_s,我找到了该按钮,并将app.config作为链接打开,但是这导致在构建时再次为每个项目创建单独的配置文件,因此,在部署3个项目时,我将有 3 个配置文件。我想做的是为某个解决方案中的所有项目保留一个文件。我可以这样做吗? 对不起,我已经更正了我的答案,说“添加”而不是“打开”——当时我面前没有 VS :) 你是对的,这只能解决构建时的共享配置...请参阅我的下一个答案。 VS2012 是否允许您从添加项目列表中添加 app.config 文件?我找不到它。【参考方案2】:

一个设计选项是完全避免直接从您的类库项目中访问 app.config,从而避免额外的外部依赖。

相反,只有您的可执行项目知道配置文件,并且当它从库创建对象或初始化它们时,它可以显式地将适当的配置信息传递给库。

【讨论】:

我同意设计问题,但我必须构建 3 个使用相同配置文件的单独控制台应用程序。你知道我是否可以设置一个通用的 app.config 文件,以及如何访问 appSettings 吗?【参考方案3】:

这是 VS 2008 中的“添加现有项目”对话框:

单击“添加”按钮上的小下拉指示器,然后从上下文菜单中选择“添加为链接”。

马克

【讨论】:

您的链接已失效。【参考方案4】:

我找到了按钮,并打开了 app.config 作为链接,但是 当构建再次创建时引起 每个项目的单独配置文件, 因此,在部署 3 项目,我将有3个配置文件。 我想做的是保持一个 一个文件中的所有项目 一定的解决办法。我可以这样做吗?

是的——你可以做,但是应该你做吗?

.NET 应用程序的基本假设是一个应用程序 = 一个配置文件。开箱即用,通过一种简单的方法,您无法在应用程序之间共享配置文件。

如果您创建自己的自定义配置部分,您可以将这些部分“外包”给可以共享的外部文件。想象一下,您创建了自己的名为“MyConfiguration”的自定义配置部分,那么您的 app.config 将如下所示:

<configuration>
  <configSections>
    <section name="MyConfiguration" 
             type="MyConfigurationSection, MyConfigurationAssembly" />
  </configSections>

  <MyConfiguration>
    <nestedElement>
      <dateTimeValue>10/16/2006</dateTimeValue>
      <integerValue>1</integerValue>
    </nestedElement>
  </MyConfiguration>
</configuration>

您可以将“MyConfiguration”部分放在自己的文件中,并从应用的配置中引用它:

<configuration>
  <configSections>
    <section name="MyConfiguration" 
             type="MyConfigurationSection, MyConfigurationAssembly" />
  </configSections>

  <MyConfiguration configSource="MyConfiguration.config" />
</configuration>

然后您的“MyConfiguration.config”将包含:

  <MyConfiguration> 
    <nestedElement>
      <dateTimeValue>10/16/2006</dateTimeValue>
      <integerValue>1</integerValue>
    </nestedElement>
  </MyConfiguration>

通过这样做,您可以“外部化”并因此至少共享大部分配置设置 - 前提是它们位于您自己的自定义配置部分中。

有关 .NET 2.0 及更高版本配置奥秘的更多信息和精彩介绍,请参阅 CodeProject 上 Jon Rista 的三部分系列 .NET 2.0 配置。

Unraveling the mysteries of .NET 2.0 configuration Decoding the mysteries of .NET 2.0 configuration Cracking the mysteries of .NET 2.0 configuration

强烈推荐,写得很好,非常有帮助!

马克

【讨论】:

此解决方案将不起作用,除非所有应用程序都部署到同一目录。 configSource 属性不能包含绝对路径,也不能包含父目录的路径。 @Jon:啊,是的,我一直忘记 .NET 部署中的“仅此目录或以下目录”规则.....你是对的。【参考方案5】:

通用配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section 
            name="appSettings" 
            type="System.Configuration.AppSettingsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
            />
    </configSections>
    <appSettings>
        <add key="key1" value="value1"/>
    </appSettings>
</configuration>

访问映射的配置文件

ConfigurationFileMap fileMap = new ConfigurationFileMap(file); //Path to your config file
Configuration configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
string value = configuration.AppSettings.Settings["key1"].Value;

【讨论】:

【参考方案6】:
System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config = ConfigurationManager.OpenExeConfiguration(Path.Combine(@"D:\", "config.exe"));
foreach (string key in config.AppSettings.Settings.AllKeys)

   string value = config.AppSettings.Settings[key].Value;
   ConfigurationManager.AppSettings.Set(key, value);

【讨论】:

【参考方案7】:

我知道这是一个老问题,但有一种更简单的方法可以实现这一点。如果您使用的是 Visual Studio 2008 或更高版本,则有一个名为“共享项目”的项目类型。

共享项目几乎可以包含其他类型的项目可以包含的任何内容。这不仅适用于 C#,而且适用于 VS2015 支持的所有语言。当共享项目中包含某些内容时,在添加对它的引用后,它可用于其他项目(见下文)。

共享项目中的类与共享库的主要区别在于,当您编译程序时,共享项目中的所有内容都将直接编译到您的项目中,而不是作为单独的文件(.dll、.exe)。可以将其想象为共享项目中的所有内容都插入到其他项目中。这是一个关于设置和使用它的小教程:

Visual Studio 2015 - 共享项目教程:

通过选择文件->新建->项目或在解决方案资源管理器中右键单击解决方案并选择添加->新项目来创建新的共享项目。当对话框出现时,选择“共享项目”,在本例中为项目命名为 TestShared。

添加新项目后,您可以添加任何需要用于其他项目的内容。在这种情况下,我们将添加 app.config。右键单击共享项目并选择添加->新项目。选择 Visual C#->Data->XML File 将其命名为 app.config。

最后通过右键单击您需要与之共享项目的项目并选择添加->引用来添加对共享项目的引用。在 Reference Manager 对话框中选择您的共享项目,它将列在左侧的“共享项目”项下。

现在共享项目中的所有内容都可以在其他项目中使用,无需使用导入或类似的任何操作。它很简单。当您开发一个程序并且需要有几个不同的 GUI(Windows、iosandroid 等)时,这种模式非常方便。例如,您可以为“核心”功能创建一个共享项目,然后为您希望在程序中支持的每个不同操作系统创建一个单独的 GUI 项目。

我意识到这是一个较老的问题,但自从谷歌出现了这个问题,我想我会回答这个问题,所以当其他人正在寻找同样的东西时,他们知道这个非常强大的 VS 功能。

【讨论】:

我注意到这适用于控制台应用程序(也许也适用于其他应用程序),但如果我从 Web 项目(例如 ASP.NET MVC)中引用它,则添加“TestShared”项目不会t出现 @FrankFu 是的,你是对的,有几种方法可以强制引用,例如 here,但是 警告 我在尝试走这条路线时遇到了一些非常灾难性的问题.我发现简单地使用 Class Library 会容易得多。 是的,我决定改用类库路径 VS 2017 让我添加一个共享项目,但不允许我从 .net 4.6.1 WebApplication 添加对它的引用。有什么想法吗? 这仅适用于共享相同语言的项目... c#、vb.net... 但如果您的解决方案有一些 C# 库和您是该死的 VB.Net 前端应用程序不允许在 c# 中移植,那么共享项目将无法执行...

以上是关于单个 app.config 多项目 c#的主要内容,如果未能解决你的问题,请参考以下文章

如何在单个项目中从 C# 中的多个配置文件中读取值?

C#app.config配置文件多组<appSettings>怎么办?

加密 App.Config 文件的 appsettings 部分中的单个密钥

Flask配置文件的几种方法

类库的 app.config 中的绑定重定向有啥作用吗?

WCF - 在单个 APP.Config 文件中定义多个服务?