Подтвердить что ты не робот

Как скомпилировать мой App.config в моем exe в VS2010 С# консольном приложении?

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

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

Ни один из googling, который я сделал, не придумал ничего. Возможно ли это?

4b9b3361

Ответ 1

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

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

Ответ 2

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

  • Создайте app.config как встроенный ресурс.
  • Вручную проанализируйте app.config, чтобы получить настройки по умолчанию приложения/строки подключения /etc
  • Ищите файл app.config и переопределите значения по умолчанию, которые вы читали ранее, с помощью значений app.config

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

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

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

Ответ 6

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

В проекте кода есть хорошая информация о чтении, записи и удалении из реестра. 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.

Счастливое кодирование и удача!

Ответ 7

Лучшее обходное решение похоже на его создание при запуске приложения.

  • Добавить App.Config в качестве ресурса, переименуйте его в "App_Config"
  • Проверьте, существует ли файл конфигурации
  • Если нет, напишите файл .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);
        }
    }

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

Ответ 9

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

Ответ 10

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