是的这是可能做到如下的 app.configweb.config 文件?

<appSettings>
 <add key="MyBaseDir" value="C:\MyBase" />
 <add key="Dir1" value="[MyBaseDir]\Dir1"/>
 <add key="Dir2" value="[MyBaseDir]\Dir2"/>
</appSettings>

然后,我想访问Dir2在我的代码,通过简单的话说:

 ConfigurationManager.AppSettings["Dir2"]

这将帮助我,当我安装应用程序在不同的服务器和地点,其中我将只需要更改一项在我整个 app.config.(我知道我可以管理所有的串联在代码,但是我喜欢它这样的方式)。

有帮助吗?

解决方案

好问题。

我认为没有。我相信如果有一种简单的方法就会非常有名,我发现Microsoft正在Visual Studio 2010中创建一种机制来部署和测试不同的配置文件。

然而,据说;我发现你在ConnectionStrings部分有一种名为<!>“; | DataDirectory | <!>”的占位符。也许你可以看看那里的工作......

这是machine.config显示它的一部分:

 <connectionStrings>
    <add
        name="LocalSqlServer"
        connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
        providerName="System.Data.SqlClient"
    />
 </connectionStrings>

其他提示

稍微复杂但更灵活的替代方法是创建一个表示配置节的类。在您的app.config / web.config文件中,您可以拥有:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <!-- This section must be the first section within the <configuration> node -->
    <configSections>
        <section name="DirectoryInfo" type="MyProjectNamespace.DirectoryInfoConfigSection, MyProjectAssemblyName" />
    </configSections>

    <DirectoryInfo>
        <Directory MyBaseDir="C:\MyBase" Dir1="Dir1" Dir2="Dir2" />
    </DirectoryInfo>
</configuration>

然后,在你的.NET代码中(我将在我的例子中使用C#),你可以创建两个这样的类:

using System;
using System.Configuration;

namespace MyProjectNamespace {

    public class DirectoryInfoConfigSection : ConfigurationSection {

        [ConfigurationProperty("Directory")]
        public DirectoryConfigElement Directory {
            get {
                return (DirectoryConfigElement)base["Directory"];
            }
    }

    public class DirectoryConfigElement : ConfigurationElement {

        [ConfigurationProperty("MyBaseDir")]
        public String BaseDirectory {
            get {
                return (String)base["MyBaseDir"];
            }
        }

        [ConfigurationProperty("Dir1")]
        public String Directory1 {
            get {
                return (String)base["Dir1"];
            }
        }

        [ConfigurationProperty("Dir2")]
        public String Directory2 {
            get {
                return (String)base["Dir2"];
            }
        }
        // You can make custom properties to combine your directory names.
        public String Directory1Resolved {
            get {
                return System.IO.Path.Combine(BaseDirectory, Directory1);
            }
        }
    }
}

最后,在您的程序代码中,您可以通过以下方式使用新类访问<=>变量:

DirectoryInfoConfigSection config =
  (DirectoryInfoConfigSection)ConfigurationManager.GetSection("DirectoryInfo");
String dir1Path = config.Directory.Directory1Resolved;  // This value will equal "C:\MyBase\Dir1"

您可以使用我的扩展库来完成: http://nuget.org/List/Packages/Expansive 来源可在此处获取: https://github.com/anderly/Expansive

我以为我刚看到这个问题。

简而言之,不,应用程序配置中没有变量插值。

您有两个选择

  1. 您可以自己滚动以在运行时替换变量
  2. 在构建时,按应用程序配置以适应目标部署环境的特定细节。关于交易的一些细节配置噩梦

你有几个选择。您可以使用构建/部署步骤执行此操作,该步骤将处理您的配置文件,使用正确的值替换您的变量。

另一种选择是定义支持此功能的配置部分。例如想象一下这个xml:

<variableAppSettings>
 <variables>
    <add key="@BaseDir" value="c:\Programs\Widget"/>
 </variables>
 <appSettings>
    <add key="PathToDir" value="@BaseDir\Dir1"/>
 </appSettings>
</variableAppSettings>

现在,您将使用自定义配置对象来实现此功能,这些对象将在运行时为您替换变量。

通常,我最终编写了一个带有属性的静态类来访问我的web.config的每个设置。

public static class ConfigManager 
{
    public static string MyBaseDir
    {
        return ConfigurationManager.AppSettings["MyBaseDir"].toString();
    }

    public static string Dir1
    {
        return MyBaseDir + ConfigurationManager.AppSettings["Dir1"].toString();
    }

}

通常,我也会在此课程中需要时进行类型转换。它允许对您的配置进行类型化访问,如果设置发生变化,您只能在一个地方进行编辑。

通常,使用此类替换设置相对容易,并提供更高的可维护性。

您可以在app.config中为您描述的场景使用环境变量

<configuration>
  <appSettings>
    <add key="Dir1" value="%MyBaseDir%\Dir1"/>
  </appSettings>
</configuration>

然后您可以轻松地获得路径:

var pathFromConfig = ConfigurationManager.AppSettings["Dir1"];
var expandedPath = Environment.ExpandEnvironmentVariables(pathFromConfig);

<appSettings>内部,您可以创建应用程序密钥

<add key="KeyName" value="Keyvalue"/>

稍后您可以使用以下方式访问这些值:

ConfigurationManager.AppSettings["Keyname"]

我建议你 DslConfig 。使用DslConfig,您可以使用Global Config的分层配置文件,每个服务器主机配置来配置每个服务器主机上的每个应用程序(请参阅AppSpike)。
如果这对您来说很复杂,您可以使用全局配置Variables.var
只需在Varibales.var中配置

baseDir = "C:\MyBase"
Var["MyBaseDir"] = baseDir
Var["Dir1"] = baseDir + "\Dir1"
Var["Dir2"] = baseDir + "\Dir2"

使用

获取配置值
Configuration config = new DslConfig.BooDslConfiguration()
config.GetVariable<string>("MyBaseDir")
config.GetVariable<string>("Dir1")
config.GetVariable<string>("Dir2")

我认为你不能声明和使用变量来定义配置文件中的appSettings键。我总是在像你这样的代码中管理连接。

我正在努力解决你想要的问题,但你可以在应用程序设置中添加覆盖文件,然后在每个环境的基础上设置覆盖文件。

<appSettings file="..\OverrideSettings.config">

对于我们需要配置大量具有相似值的项目的产品,我们使用小型控制台应用程序来读取XML并根据传入的参数进行更新。然后安装程序在询问后调用这些应用程序。用户提供所需信息。

我建议遵循Matt Hamsmith的解决方案。如果这是一个要实现的问题,那么为什么不创建一个在AppSettings类的后台实现它的扩展方法呢?

类似的东西:

    public static string GetValue(this NameValueCollection settings, string key)
    {

    }

在方法内部,您使用Linq搜索DictionaryInfoConfigSection并使用匹配键返回值。您需要更新配置文件,以及以下内容:

<appSettings>
  <DirectoryMappings>
    <DirectoryMap key="MyBaseDir" value="C:\MyBase" />
    <DirectoryMap key="Dir1" value="[MyBaseDir]\Dir1"/>
    <DirectoryMap key="Dir2" value="[MyBaseDir]\Dir2"/>
  </DirectoryMappings>
</appSettings>

我提出了这个解决方案:

  1. 在应用程序Settings.settings中我定义了一个变量ConfigurationBase(type = string Scope = Application)
  2. 我在Settings.settings中的目标属性中引入了一个变量,所有这些属性都必须设置为Scope = User
  3. 在app.xaml.cs中,我读出了ConfigurationBase
  4. 的值
  5. 在app.xaml.cs中,我用ConfigurationBase值替换了所有变量。为了在运行时替换值,必须将属性设置为Scopr = User
  6. 我对这个解决方案并不满意,因为我必须手动更改所有属性,如果我添加一个新的属性,我必须在app.xaml.cs中考虑它。

    这是App.xaml.cs的代码片段:

    string configBase = Settings.Default.ConfigurationBase;
    Settings.Default.CommonOutput_Directory = Settings.Default.CommonOutput_Directory.Replace("${ConfigurationBase}", configBase);
    

    <强>更新

    刚刚找到了改进(同样是app.xaml.cs的代码片段):

    string configBase = Settings.Default.ConfigurationBase;
    
    foreach (SettingsProperty settingsProperty in Settings.Default.Properties)
    {
        if (!settingsProperty.IsReadOnly && settings.Default[settingsProperty.Name] is string)
        {
            Settings.Default[settingsProperty.Name] = ((string)Settings.Default[settingsProperty.Name]).Replace("${ConfigurationBase}", configBase);
        }
    }
    

    现在,替换适用于我的设置中具有Type = string和Scope = User的所有属性。我想我喜欢这样。

    <强> UPDATE2

    在属性上运行时,显然不需要设置Scope = Application。

三种可能的解决方案

我知道我来迟到了,我一直在找是否有任何新的解决方案的可变构设置问题。有几个答案,触摸的解决方案,我已在过去使用,但大多数似乎有点令人费解的。我想我会看看我的旧的解决方案,并把实现中在一起,以便它可以帮助人们正在努力与同样的问题。

对这个例子中,我已经使用了以下程序,设定在应用控制台:

<appSettings>
    <add key="EnvironmentVariableExample" value="%BaseDir%\bin"/>
    <add key="StaticClassExample" value="bin"/>
    <add key="InterpollationExample" value="{0}bin"/>
  </appSettings>

1.使用环境变量

我相信autocro autocro的答案 谈到了它。我只是在做一个实现这应该足够了时,建设或者调试,而不必靠近visual studio.我用这个解决方案回到在一天...

  • 创建一个预先建立的事件,将使用请参阅变量

    警告:用一个变量,不会被取代容易所以用你的项目名称或类似的东西作为一个变量名称。

    SETX BaseDir "$(ProjectDir)"

  • 复位变量;使用类似的如下:

    刷新环境变量的溢出栈

  • 使用的设置在代码:

'

private void Test_Environment_Variables()
{
    string BaseDir = ConfigurationManager.AppSettings["EnvironmentVariableExample"];
    string ExpandedPath = Environment.ExpandEnvironmentVariables(BaseDir).Replace("\"", ""); //The function addes a " at the end of the variable
    Console.WriteLine($"From within the C# Console Application {ExpandedPath}");
}

'

2.使用的字符串内插法:

  • 使用的字符串。格式()function

`

private void Test_Interpollation()
{
    string ConfigPath = ConfigurationManager.AppSettings["InterpollationExample"];
    string SolutionPath = Path.GetFullPath(Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, @"..\..\"));
    string ExpandedPath = string.Format(ConfigPath, SolutionPath.ToString());
    Console.WriteLine($"Using old interpollation {ExpandedPath}");
}

`

3.使用静态的类,这是解决我大多是使用。

  • 执行情况

`

private void Test_Static_Class()
{
    Console.WriteLine($"Using a static config class {Configuration.BinPath}");
}

`

  • 静类

`

static class Configuration
{
    public static string BinPath
    {
        get
        {
            string ConfigPath = ConfigurationManager.AppSettings["StaticClassExample"];
            string SolutionPath = Path.GetFullPath(Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, @"..\..\"));
            return SolutionPath + ConfigPath;
        }
    }
}

`

项目代码:

应用程序。配置:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
    </startup>
  <appSettings>
    <add key="EnvironmentVariableExample" value="%BaseDir%\bin"/>
    <add key="StaticClassExample" value="bin"/>
    <add key="InterpollationExample" value="{0}bin"/>
  </appSettings>
</configuration>

程序。cs

using System;
using System.Configuration;
using System.IO;

namespace ConfigInterpollation
{
    class Program
    {
        static void Main(string[] args)
        {
            new Console_Tests().Run_Tests();
            Console.WriteLine("Press enter to exit");
            Console.ReadLine();
        }        
    }

    internal class Console_Tests
    {
        public void Run_Tests()
        {
            Test_Environment_Variables();
            Test_Interpollation();
            Test_Static_Class();
        }
        private void Test_Environment_Variables()
        {
            string ConfigPath = ConfigurationManager.AppSettings["EnvironmentVariableExample"];
            string ExpandedPath = Environment.ExpandEnvironmentVariables(ConfigPath).Replace("\"", "");
            Console.WriteLine($"Using environment variables {ExpandedPath}");
        }

        private void Test_Interpollation()
        {
            string ConfigPath = ConfigurationManager.AppSettings["InterpollationExample"];
            string SolutionPath = Path.GetFullPath(Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, @"..\..\"));
            string ExpandedPath = string.Format(ConfigPath, SolutionPath.ToString());
            Console.WriteLine($"Using interpollation {ExpandedPath}");
        }

        private void Test_Static_Class()
        {
            Console.WriteLine($"Using a static config class {Configuration.BinPath}");
        }
    }

    static class Configuration
    {
        public static string BinPath
        {
            get
            {
                string ConfigPath = ConfigurationManager.AppSettings["StaticClassExample"];
                string SolutionPath = Path.GetFullPath(Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, @"..\..\"));
                return SolutionPath + ConfigPath;
            }
        }
    }
}

预先建立的事件:

项目设置->建立的事件

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top