Как получить ApplicationSettings из загруженного приложения.файл config?

можно ли получить доступ к значениям от applicationsettings-это раздел загруженного приложения.файл config?

Я нашел пример как мне получить параметр appsettings, но я не могу узнать, как получить доступ applicationsettings-это этот путь.

3 ответов


на applicationsettings-это are только для чтения во время выполнения. Вы можете установить / изменить их либо с помощью текстового редактора в приложении.конфигурационный файл напрямую, но рекомендуется открыть свойства проекта в Visual Studio и выбрать вкладку" Настройки". Важно установить правильный объем:

  • если настройки применяются ко всему приложению (для всех пользователей), выберите "приложения" как сфера.
  • если каждый пользователь должен иметь индивидуальные настройки (привязаны к профилю пользователя), затем выберите "пользователь"

например, если вы создаете myOwnSetting в проекте WindowsFormsTestApplication1 следующим образом:

myOwnSetting

он добавит следующее в приложение приложения.конфигурационный файл:

<configuration>
    <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
        <section name="WindowsFormsTestApplication1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
    </configSections>
    <applicationSettings>
        <WindowsFormsTestApplication1.Properties.Settings>
            <setting name="myOwnSetting" serializeAs="String">
                <value>Hi there!</value>
            </setting>
        </WindowsFormsTestApplication1.Properties.Settings>
    </applicationSettings>
</configuration>

Visual Studio создает код C# для автоматического доступа к этому параметру (поэтому вы должны сделать это в свойствах проекта и не через текстовый редактор) - после сохранения изменений из того же пространства имен вы можете легко прочитать его значение в приложении с помощью следующего кода:

var currentValue = Properties.Settings.Default.myOwnSetting;

учитывая applicationSettings в приведенном выше списке это приведет к получению строки " Привет!"для переменной currentValue.

Примечание что если вы создали myOwnSetting на "пользователь" объем, затем он хранится в разделе <userSettings> вместо <applicationSettings>, но вы все еще можете получить к нему доступ с этой строки кода.

еще одно отличие объем "пользователя" настройки - это то, что у вас есть доступ для чтения и записи, т. е. разрешено делать следующее:

        Properties.Settings.Default.myUserSetting = "Something else";
        Properties.Settings.Default.Save();

если вы попробуете то же самое с областью "Application", устанавливающей myOwnSetting, это приведет к ошибке компиляции, сообщающей вам, что она доступна только для чтения.

если вы повторно запустите приложение, вы заметите, что myUserSetting изменился на значение "что - то еще" - но старое значение все еще находится в приложении.конфиг. Почему это так? Причина в том, что он рассматривается как значение по умолчанию - и, как я уже говорил ранее, область "пользователь" привязана к профилю пользователя. Как следствие, значение "что-то еще" сохраняется в

C:\Documents and Settings\USERID\Local Settings\Application Data\FIRMNAME\WindowsFormsTestApplicati_Url_tdq2oylz33rzq00sxhvxucu5edw2oghw.0.0.0

в файле с именем User.config, который выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <userSettings>
        <WindowsFormsTestApplication1.Properties.Settings>
            <setting name="myUserSetting" serializeAs="String">
                <value>Something else</value>
            </setting>
        </WindowsFormsTestApplication1.Properties.Settings>
    </userSettings>
</configuration>

вы не можете точно сказать путь, как он создается автоматически .NET Framework, и он будет выглядеть по-другому на свой компьютер. Но вы можете видеть, что USERID-это идентификатор пользователя Windows текущего пользователя, FIRMNAME-часть указанной вами информации о сборке, а имя и версия сборки также используются в пути.


Примечание:

  • на <sectionGroup> С <section> объявление является обязательным, и его атрибут name должен соответствовать пространству имен. Пространство имен должно отображаться ровно один раз в конфигурации, и существует только один допущено.

  • как вы могли видеть в файле конфигурации, пространство имен явно упоминается там (WindowsFormsTestApplication1.Properties.Settings). Как следствие, если вы хотите получить доступ к настройкам из кода, не находящегося в том же пространстве имен, вам может потребоваться использовать полную ссылку. Сказав это, будьте осторожны, если вы копируете весь <applicationSettings>...</applicationSettings> раздел из конфигурации одного приложения в другое - вам может потребоваться изменить пространство имен в целевой конфигурации впоследствии.

  • если вы используете конструктор настроек (вкладка настройки в вашем проекте), это создаст файл с именем Settings.Settings (вместе с Settings.Designer.cs для доступа к sessings через код C#) в разделе свойства проекта. Это копия настроек, так как она будет храниться в вашем Web.config или App.config файл также (в зависимости от типа проекта, только для настроек области приложения-пользовательские настройки области сохраняются на основе пользователя профиль.) Вы можете создать дополнительные *.settings файлы и использовать их (как это описано здесь).

  • если вы не С помощью конструктора настроек, или если вы используете такой инструмент, как помощью linqpad, возможно, вам придется использовать другой подход. Рассматривайте это:

    internal static string GetApplicationSetting(string key, 
            string nameSpace="Properties.Settings")
    {
        string xValue=null;
        try 
        {
            string path = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
            XDocument doc = XDocument.Load(path);
            var xPathStr= string.IsNullOrEmpty(nameSpace) 
                            ? "//applicationSettings" 
                            : $"//applicationSettings/{nameSpace}";
            var settings=doc.XPathSelectElement(xPathStr).Elements().Where(
                                w => w.Name=="setting" 
                                    && w.HasAttributes 
                                    && w.Attribute("serializeAs").Value=="String"
                                );
            var setting=settings.Where(f => f.HasAttributes 
                                            && f.Attribute("name").Value==key).Elements();
            xValue=setting.FirstOrDefault().Value;
        }
        catch {}
        return xValue;
    }
    

    вы можете прочитать строку типа applicationSettings рассматривая конфигурацию как XDocument. Приведенный пример ограничен типом string и вы можете получить настройки из приложения.пример конфигурации выше следующим образом:
    var value=GetApplicationSetting("myOwnSetting", "WindowsFormsTestApplication1.Properties.Settings");
    Аналогично, вы можете создать аналогичную функцию GetUserSetting по умолчанию <userSettings> раздел: просто скопируйте код выше, переименуйте имя функции и замените applicationSettings на xPathStr by userSettings.

  • для пользовательских настроек доступен метод обновления, который описан здесь. Подробнее о месте, где пользовательские настройки хранятся можно найти здесь.

  • на <appSettings> раздел в конфигурации работает по-разному, так как он не различает область "Пользователь" и "приложение" и не поддерживает разные типы данных, только строки. Тем не менее, это можно легко читать и писать настройки ключей/значений. Если вас интересует код, вы можете найти его здесь (on stackoverflow):
    как читать / писать настройки конфигурации appSettings

  • если вы не уверены, следует ли вам использовать AppSettings или applicationSettings, потом читать это прежде чем вы решите его.


Как вы сделали настройки? Использование конструктора настроек VS? Если это так, он должен создать вам строго типизированный класс для доступа к ним. Это обычно доступно с помощью Properties.Settings.Default.SettingName

Я думаю, что предпочтительнее использовать applicationSettings, а не appSettings, но настройки приложения читаются только во время выполнения, т. е. вы не можете создать их из своего кода, но я считаю, что можно создавать и добавлять appSettings во время выполнения. Я задал вопрос о разница

вы можете найти более подробную информацию из msdn


Вы можете загрузить файл конфигурации в XmlDocument и повторить applicationSettings из объекта dom . Вот пример, который я нашел, чтобы загрузить файл конфигурации в объект dom :

//retrive the current assembly directory
private static string AssemblyDirectory()
{
        string codeBase = Assembly.GetExecutingAssembly().CodeBase;
        UriBuilder uri = new UriBuilder(codeBase);
        string path = Uri.UnescapeDataString(uri.Path);
        return Path.GetDirectoryName(path);
}



//return the value from aplicationSetting according to the given key
//appSettingSection is the your configuration section as declare in your web.config
public static string GetApplicationSettingValue(string appSettingSection,string key)
{
   //get web.config path
   string configPath  = new System.IO.DirectoryInfo(AssemblyDirectory()).Parent.FullName + "\web.config";

    System.IO.FileInfo FileInfo = new System.IO.FileInfo(configPath);
    if (!FileInfo.Exists)
    {
        throw new Exception("Missing config file");
    }

    //load config file into xml document
    var XmlConfig = new System.Xml.XmlDocument();
    XmlConfig.Load(FileInfo.FullName);


     //override xml document and return the value of the key under applicationSettings
     foreach (System.Xml.XmlNode node in XmlConfig["configuration"]  ["applicationSettings"]appSettingSection])
     {
                    if (node.Name == "setting")
                    {
                        if (node.Attributes.GetNamedItem("name").Value == key)
                        {
                            return node.FirstChild.InnerXml.ToString();
                        }
                   }
     }
   return "";
}