Создать копию exe с другим ресурсом во время выполнения - PullRequest
6 голосов
/ 19 марта 2012

Мы хотели бы предложить нашему клиенту возможность создавать индивидуальные exe-файлы, основанные на наших, для своих клиентов.

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

В настоящее время я думаю написать dll во время выполнения, включая ресурс (используя AssemblyBuilder), а затем вызвать ILMerge для встраивания его в финальный exe, но это немного более хакерски, чем хотелось бы.

Так что это большой вопрос, но, может быть, стоит все-таки спросить: есть ли библиотека .NET, позволяющая изменять ресурсы .NET exe, которая могла бы избежать целого бита "dll, удерживающего ресурс, встроенный в ILMerge"?

Или, альтернативно, есть ли лучший подход к этому, который все еще соответствует поставленным целям?

Ответы [ 2 ]

2 голосов
/ 19 марта 2012

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

0 голосов
/ 19 марта 2012

Хотя это не тот подход, который я бы выбрал для решения этой проблемы, есть библиотека, позволяющая вам изменять встроенные ресурсы скомпилированного исполняемого файла Cecil .

Встраивание ресурса с помощью Cecil:

Включения пространства имен:

    using Mono.Cecil; // supports both net and mono

встраивание ресурса:

    static void Main(string[] args)
    {
        string pathToExecutable = "Target.exe";

        byte[] encoding = Encoding.Unicode.GetBytes("<Data><!-- data goes here --></Data>");

        var resource = new EmbeddedResource(
               "ConfigurationFile", 
                ManifestResourceAttributes.Private, 
                encoding);

        var asm = AssemblyDefinition.ReadAssembly(pathToExecutable);

        asm.Modules.FirstOrDefault().Resources.Add(resource);

        asm.Write(pathToExecutable);
    }
...