Как мне скомпилировать мой App.config в мой exe в консольном приложении VS2010 C #? - PullRequest
30 голосов
/ 03 января 2011

Я создаю консольное приложение в Visual Studio 2010 с помощью c #.Я хочу, чтобы это приложение было автономным, так как все, что вам нужно, это exe, и вы можете запустить его из любого места.Я также хочу использовать app.config для хранения строк подключения и так далее.

Моя проблема в том, что я не могу понять, как включить эти данные app.config в скомпилированный exe.Я вижу, что он создает appname.exe.config, но я не хочу, чтобы люди беспокоились о получении двух отдельных файлов при получении приложения.

Ни один из поисковиков, которые я делал, ничего не придумал.Это вообще возможно?

Ответы [ 10 ]

12 голосов
/ 03 января 2011

Вы не можете.Половина таких файлов конфигурации заключается в том, чтобы разрешить изменения конфигурации приложения вне самого приложения.

Вам просто нужно изменить программу, чтобы она не зависела от конфигурации приложения.file - самый простой способ сделать это - просто вставить значения внутри вашей конфигурации в глобальные переменные только для чтения.

9 голосов
/ 03 января 2011

Я вижу, куда вы идете с этим, но ответ может быть немного сложнее, чем вы искали.

  1. Сделать app.config встроенным ресурсом .
  2. Вручную проанализируйте app.config, чтобы получить по умолчанию настройки приложения / строки подключения / и т. Д.
  3. По-прежнему ищите app.config и переопределяйте значения по умолчанию, которые вы прочитали ранее, значениями app.config

Таким образом, у вас есть разумные значения по умолчанию, которые вам не нужно поддерживать отдельно от app.config в качестве констант, вы можете запускать свое приложение как просто исполняемый файл, и вы все равно можете изменить его во время выполнения, добавив обратно app.config.

Единственное, что нужно помнить, это то, что чтение в app.config из ресурса не даст вам того же поведения, что и в обычном app.config. Вы в основном читаете это и используете это вручную.

5 голосов
/ 03 января 2011

Вы имеете в виду, что вам нужно добавить его в exe как ресурс?Ну, во-первых, вы не можете, app.config основан на файлах, а не на ресурсах.

С другой стороны, единственная точка в файле конфигурации - это то, что вы можете изменить его.В противном случае просто используйте жесткий код или используйте константы.

4 голосов
/ 03 января 2011

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

В качестве альтернативы вы можете написать собственный раздел конфигурации, в котором каждый элемент необязателен исо значениями по умолчанию.Таким образом, любой, кто может обойтись с настройками по умолчанию, не нуждается в файле конфигурации.Но если им нужно переопределить значение по умолчанию, они могут предоставить его.

(Извините, просто немного мозгового штурма. У меня нет доступного примера.)

3 голосов
/ 30 июня 2015

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

  1. Добавить App.Config в качестве ресурса, переименовать его в «App_Config»
  2. Проверьте, существует ли файл конфигурации
  3. Если нет, напишите файл .config по умолчанию

Пример кода:

Program.cs

    [STAThread]
    static void Main()
    {
        CreateConfigIfNotExists();
    }

    private static void CreateConfigIfNotExists()
    {
        string configFile = string.Format("{0}.config", Application.ExecutablePath);

        if (!File.Exists(configFile))
        {
            File.WriteAllText(configFile, Resources.App_Config);
        }
    }

Помните, что при создании будет записываться только ваша текущая конфигурация. Он не будет обновлять его автоматически при развертывании новой версии. Он будет включать конфиг как есть при сборке. Но этого может быть достаточно:)

3 голосов
/ 03 января 2011

Как правило, вы не хотите делать это, так как ваш app.config предоставляет механизм, с помощью которого можно выполнить настройку во время выполнения.Что касается вашей конкретной цели (сохранение конфигурации вне вашего кода, но она должна следовать бинарному), у вас есть несколько вариантов:

  • Динамическое создание файла конфигурации
  • Storeнастройки в реестре
  • Сохраните настройки в виде строк ресурсов в консольном приложении

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

2 голосов
/ 19 декабря 2011

Как люди говорят здесь, весь смысл файла конфигурации заключается в изменении некоторых настроек вне приложения. Вы можете жестко программировать или использовать константы, но вы также можете использовать реестр в Windows, если хотите. Таким образом, вы можете вносить изменения в приложение и при этом иметь только один исполняемый файл.

В проекте кода есть хорошая информация о чтении, записи и удалении из реестра. http://www.codeproject.com/KB/system/modifyregistry.aspx Но будьте осторожны при редактировании реестра. От этого зависит множество приложений, поэтому вы можете уничтожить некоторые настройки, если что-то не так. Я рекомендую читать, а затем делать.

public string Read(string KeyName)  {
RegistryKey rk = baseRegistryKey;
// Open a subKey as read-only

RegistryKey sk1 = rk.OpenSubKey(subKey);
// If the RegistrySubKey doesn't exist -> (null)

if ( sk1 == null )
{
    return null;
}
else
{
    try 
    {
        // If the RegistryKey exists I get its value
        // or null is returned.
        return (string)sk1.GetValue(KeyName.ToUpper());
    }
    catch (Exception e)
    {
        // AAAAAAAAAAARGH, an error!
        ShowErrorMessage(e, "Reading registry " + KeyName.ToUpper());
        return null;
    }
  }
}

public bool Write(string KeyName, object Value)  {
  try
  {
      // Setting
      RegistryKey rk = baseRegistryKey ;
      // I have to use CreateSubKey 
      // (create or open it if already exits), 
      // 'cause OpenSubKey open a subKey as read-only
      RegistryKey sk1 = rk.CreateSubKey(subKey);
      // Save the value
      sk1.SetValue(KeyName.ToUpper(), Value);
      return true;
  }
  catch (Exception e) {
        // AAAAAAAAAAARGH, an error!
        ShowErrorMessage(e, "Writing registry " + KeyName.ToUpper());
        return false;
    }
  }    

public bool DeleteKey(string KeyName)  {
  try
  {
      // Setting
      RegistryKey rk = baseRegistryKey ;
      RegistryKey sk1 = rk.CreateSubKey(subKey);
      // If the RegistrySubKey doesn't exists -> (true)
      if ( sk1 == null )
          return true;
      else
          sk1.DeleteValue(KeyName);
      return true;
  }
  catch (Exception e)
  {
      // AAAAAAAAAAARGH, an error!
      ShowErrorMessage(e, "Deleting SubKey " + subKey);
      return false;
  }
}

Конечно, это будет работать только на Windows. Я предполагаю, что вы используете Visual Studio, поэтому вы, вероятно, используете Windows.

Удачного кодирования и удачи!

2 голосов
/ 03 января 2011

Пожалуйста, первый ответ на этот предыдущий пост - Файл конфигурации как встроенный ресурс

1 голос
/ 12 мая 2015

У IL Merge много проблем с исполняемым файлом wpf.Я закончил тем, что использовал Cosura.Fody https://github.com/Fody/Costura и использовал параметр командной строки для передачи значения конфигурации моего приложения.Также используя iexpress http://en.wikipedia.org/wiki/IExpress для создания конечного исполняемого файла с аргументами командной строки и exe, объединенными вместе

0 голосов
/ 11 августа 2016

Возьмите приложение winform, например, во время компиляции будет создан файл 'xxx.EXE.config' вместе с выходным EXE-файлом.Он будет содержать настройки «app.config».Распространите это также.

...