Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不同的应用程序设置取决于配置模式_C#_.net_Vb.net_Settings_Appsettings - Fatal编程技术网

C# 不同的应用程序设置取决于配置模式

C# 不同的应用程序设置取决于配置模式,c#,.net,vb.net,settings,appsettings,C#,.net,Vb.net,Settings,Appsettings,有人知道我可以在.Net应用程序中设置应用程序(或用户)级别设置的方法吗?这些设置取决于应用程序当前的开发模式?IE:调试/发布 更具体地说,我在应用程序设置中有一个对Web服务的url引用。在发布模式期间,我希望这些设置指向调试模式期间,我希望这些设置是正确的 有什么想法吗 据我所知,没有一种内在的方法可以做到这一点。在我们的项目中,我们维护4个不同的设置文件,并通过在构建的预构建步骤中将每个文件复制到活动文件中来在它们之间切换 copy "$(ProjectDir)properties\se

有人知道我可以在.Net应用程序中设置应用程序(或用户)级别设置的方法吗?这些设置取决于应用程序当前的开发模式?IE:调试/发布

更具体地说,我在应用程序设置中有一个对Web服务的url引用。在发布模式期间,我希望这些设置指向调试模式期间,我希望这些设置是正确的


有什么想法吗

据我所知,没有一种内在的方法可以做到这一点。在我们的项目中,我们维护4个不同的设置文件,并通过在构建的预构建步骤中将每个文件复制到活动文件中来在它们之间切换

copy "$(ProjectDir)properties\settings.settings.$(ConfigurationName).xml" "$(ProjectDir)properties\settings.settings"
copy "$(ProjectDir)properties\settings.designer.$(ConfigurationName).cs" "$(ProjectDir)properties\settings.Designer.cs"
这几年来对我们来说是完美无瑕的。只需更改目标,整个配置文件也会切换

编辑:文件的名称为,例如
settings.settings.Debug.xml
settings.settings.Release.xm
l等

Scott Hanselman描述了一种稍微“聪明”的方法,唯一的区别是我们没有检查文件是否已更改:

如果要将所有内容保存在一个配置文件中,可以在app.settings中引入自定义配置部分,以存储调试和发布模式的属性

您可以在应用程序中持久化存储特定于开发模式设置的对象,也可以基于调试开关覆盖现有的应用程序设置

下面是一个简短的控制台应用程序示例(DevModeDependencyTest):

App.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <sectionGroup name="DevModeSettings">
      <section name="debug" type="DevModeDependencyTest.DevModeSetting,DevModeDependencyTest" allowLocation="true" allowDefinition="Everywhere" />
      <section name="release" type="DevModeDependencyTest.DevModeSetting,DevModeDependencyTest" allowLocation="true" allowDefinition="Everywhere" />
    </sectionGroup>
  </configSections>
  <DevModeSettings>
    <debug webServiceUrl="http://myDebuggableWebService.MyURL.com" />
    <release webServiceUrl="http://myWebservice.MyURL.com" />
  </DevModeSettings>
  <appSettings>
    <add key="webServiceUrl" value="http://myWebservice.MyURL.com" />
  </appSettings>
</configuration>
访问自定义配置设置的处理程序(DevModeSettingsHandler.cs):

最后是控制台应用程序(DevModeDependencyTest.cs)的入口点:


我知道这是几年前提出的问题,但以防万一,任何人都在寻找我使用的简单有效的解决方案

  • 转到“项目属性”、“设置”选项卡(您将看到您的web服务URL或此处已列出的任何其他设置)

  • 单击设置页面上的“查看代码”按钮

  • 在构造函数中键入此项

    this.SettingsLoaded += Settings_SettingsLoaded;
    
  • 在构造函数下添加以下函数:

    void Settings_SettingsLoaded(object sender, System.Configuration.SettingsLoadedEventArgs e)
    {
        #if(DEBUG)
        this["YOUR_SETTING_NAME"] = VALUE_FOR_DEBUG_CONFIGURATION;
        #else
        this["YOUR_SETTING_NAME"] = VALUE_FOR_RELEASE_CONFIGURATION;
        #endif
    }
    

  • 现在,无论何时运行项目,它都将只编译与当前生成配置匹配的行。

    SlowCheetah不仅为App.config而且为项目中的任何XML文件添加了您要求的功能-

    这有点晚了,但是我偶然发现了一种很好的方法,可以为
    app.config
    文件实现
    web.transform
    方法。(即,它使用名称空间
    http://schemas.microsoft.com/XML-Document-Transform

    我认为它“很好”,因为它是一种纯xml方法,不需要第三方软件。

    • 父/默认App.config文件是根据您的各种构建配置派生而来的
    • 然后,这些子体只覆盖它们需要覆盖的内容
    在我看来,这比必须维护
    x
    完整复制的配置文件数量(如在其他答案中)要复杂和健壮得多

    已在此处发布演练:



    看,妈妈-在我的IDE中没有显式的编译后事件

    我有一个类似的问题需要解决,最后使用了XDT(web.config)转换引擎,这已经在NE1410的答案中得到了建议,可以在这里找到:

    但是我没有像他链接中所描述的那样手动操作,而是使用了这个插件:


    插件只是帮助设置配置,不需要构建,解决方案可以在其他机器或构建服务器上构建,而不需要插件或任何其他工具。

    虽然这在理论上可以回答问题,但在此处包含答案的基本部分,并提供链接以供参考。我认为这可能是最好的答案——它似乎允许每个构建配置app.config转换(与web.config转换中的构建非常相似)。工作正常,谢谢!如果您使用的是VS 2017,并且错误显示找不到Web*.targets,那么请查看VS 2017的此答案,
    v10.0
    必须在
    中替换为
    v15.0
    。使用
    Project=“$(MSBuildExtensionPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.targets“
    (从链接中的注释中)适用于任何Visual Studio版本。现在有一个VS插件用于此:。在哪里/如何指定每个配置的更改?例如,如果我创建了一个名为“QALease”的配置,我将如何检查这是否是当前配置?不确定我是否正确理解了您的意思,但有
    #if(DEBUG)
    用于区分调试和发布配置的预处理器指令。此外,您可以为每个配置定义自己的编译符号,并在
    #if
    中使用它们。谢谢。我不确定你的
    调试
    来自哪里。
    
     using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Configuration;
    
    namespace DevModeDependencyTest
    {
        class DevModeDependencyTest
        {
            static void Main(string[] args)
            {
                DevModeSetting devMode = new DevModeSetting();
    
                #if (DEBUG)
                    devMode = DevModeSettingsHandler.GetDevModeSetting("debug");
                    ConfigurationManager.AppSettings["webServiceUrl"] = devMode.WebServiceUrl;
                #endif
    
                Console.WriteLine(ConfigurationManager.AppSettings["webServiceUrl"]);
                Console.ReadLine();
            }
        }
    }
    
    this.SettingsLoaded += Settings_SettingsLoaded;
    
    void Settings_SettingsLoaded(object sender, System.Configuration.SettingsLoadedEventArgs e)
    {
        #if(DEBUG)
        this["YOUR_SETTING_NAME"] = VALUE_FOR_DEBUG_CONFIGURATION;
        #else
        this["YOUR_SETTING_NAME"] = VALUE_FOR_RELEASE_CONFIGURATION;
        #endif
    }