C# Изменение указанных при компиляции значений программы

190
09 марта 2018, 12:33

У меня есть приложение с заданной переменной, к примеру

string str = "example";

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

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

Для вышеописанного необходима рекомпиляция, или можно как-то изменить тот самый string из вне?

PS: задача именно в изменении самой программы. Это значит, что она должна в итоге запускаться без каких либо дополнительных файлов и действий, как обычный exe.

Answer 1

Вы не должны менять константы в исполнимом файле. Дело в том, что вы не знаете, где и как такая константа будет использована. Например, компилятор C# обычно объединяет одинаковые константы в одну, так что изменения в одной константе могут привести к очень странным последствиям.

Пример:

static void Main(string[] args)
{
    DoTerribleHack();
    Console.WriteLine("привет");
}
static unsafe void DoTerribleHack()
{
    string s = "привет";
    fixed (char* p = s)
    {
        p[0] += '\x6';
        p[2] += '\x16';
        p[5] -= '\xe';
    }
}

Программа выводит, как некоторые уже догадались,

хрювед

Поэтому я бы очень не рекомендовал менять ваш скомпилированный файл. Правильное место для конфигурации — дополнительный файлы, например, App.config.

Пример для App.config:

Сам файл:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.1"/>
    </startup>
    <appSettings> <!-- эту часть вы добавляете: -->
        <add key="greeting" value="привет" />
    </appSettings>
</configuration>

В проект добавляете ссылку на System.Configuration.dll, и пишете:

var greeting = ConfigurationManager.AppSettings["greeting"];
Console.WriteLine(greeting);

Да, это больше одного файла.

READ ALSO
Не обрабатывается кнопка - Unity3D

Не обрабатывается кнопка - Unity3D

Не обрабатывается кнопка при ее нажатии, хотя скрипт к кнопке подключен, метод вызывается, но через breakpoint приложение не останавливает при...

147
В списке intellisense нет нужного метода

В списке intellisense нет нужного метода

Есть работающий класс, использующий MicrosoftOffice

150
Обновление модели в базе данных Entity Framework

Обновление модели в базе данных Entity Framework

Изменяю данные пользователя на сайте, user_'у присваиваются поля user'a, но изменения не вступают в силуЕсли же изменять поля пользователя по отдельности...

178
C# ftp загрузка файлов из директории

C# ftp загрузка файлов из директории

Как реализовать функцию загрузки всех файлов из X директории в Y директорию на ftp

148