Как программно заменить встроенные ресурсы в сборке .NET?

Я пытаюсь заменить ресурс файла exe (.NET, С#) с помощью кода С#.

Я нашел эту статью и сделал этот код (используя Mono.Cecil 0.6):

AssemblyDefinition asdDefinition = AssemblyFactory.GetAssembly("C:\\File.exe");
EmbeddedResource erTemp = new EmbeddedResource("encFile", ManifestResourceAttributes.Public);
erTemp.Data = myNewFileBytes;
asdDefinition.MainModule.Resources.RemoveAt(0);
asdDefinition.MainModule.Resources.Add(erTemp);
AssemblyFactory.SaveAssembly(asdDefinition, "C:\\newFile.exe");

Код фактически удаляет ресурс, а затем добавляет новый с тем же именем. Имя ресурса encFile и хранится как encFile.exe (пробовал оба).

Я протестировал код, и удаление работает (я могу сказать по размеру файла) и добавление тоже, но новый файл падает, как и файл, который я создал только с удалением (для тестирования) - он действует как он не видит замененный ресурс.

Что я могу сделать, чтобы исправить это? Может быть, какие-то изменения в отредактированном EXE-файле? EXE-файл читает свой ресурс следующим образом:

byte[] buffer = ProjectName.Properties.Resources.encFile;


person eranj    schedule 03.08.2011    source источник
comment
Какова ваша конечная цель с этим? Почему вы должны делать это вместо того, чтобы просто использовать настройки?   -  person Branko Dimitrijevic    schedule 03.08.2011
comment
Я хочу изменить этот ресурс, не залезая в Visual Studio.   -  person eranj    schedule 03.08.2011
comment
то же самое, я думаю, я спросил stackoverflow.com/questions/6757457/   -  person arun kumar non ascii    schedule 03.08.2011
comment
не то же самое. Здесь у меня есть код, который на самом деле должен работать, но не работает.   -  person eranj    schedule 03.08.2011
comment
Вы уверены, что название ресурса точно такое же? (encFile) Попробуйте изучить ресурсы сборки в отладчике, чтобы быть на 100% уверенным, что у вас правильное имя.   -  person Justin    schedule 03.08.2011
comment
да, потому что ProjectName.Properties.Resources.encFile - это то, как я получаю файл в EXE..   -  person eranj    schedule 03.08.2011
comment
@eranj, не могли бы вы сказать более конкретно, чем «сбой файла»? Я предлагаю вам применить совет Крагена и еще раз проверить, что ресурс с индексом 0 имеет имя encFile, а не что-то вроде ProjectName.encFile. Самый простой способ — просто изменить данные ресурса с индексом 0 (вы должны привести его к EmbeddedResource), вместо того, чтобы создавать новый. Также я настоятельно рекомендую вам обновиться до Cecil 0.9.x.   -  person Jb Evain    schedule 04.08.2011
comment
2 вещи приходят на ум. Целевая сборка подписана строгим именем, или cecil ломает сборку. Без дополнительной информации трудно сказать, что именно.   -  person Will    schedule 05.08.2011
comment
Адаптация файла .exe — это действительно то, что вам нужно? Из соображений безопасности ваш антивирусный сканер должен заблокировать это! А также: в среде Windows вашей программе не разрешено записывать файл в папку с программными файлами. Пожалуйста, пересмотрите это, является ли это хорошей практикой или нет.   -  person Dev.Jaap    schedule 12.08.2011
comment
Сборка подписана? Если это так, то это не сработает по замыслу.   -  person justin.m.chase    schedule 13.09.2011


Ответы (1)


Попытка сделать это кажется слишком сложной. Если вам нужно динамическое обновление ресурсов, отправьте свои ресурсы в виде папки для вашего приложения (установите элементы в папке как содержимое и скопируйте, если они новее, в свойствах проекта).

Если вам нужно динамическое обновление во время выполнения, то это так же просто:

1] Разрешить пользователю заменять элементы на месте или
2] Еще лучше, относитесь к ним как к темам Wordpress и разрешайте переопределять папку для каждого ресурса.

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

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

person jjxtra    schedule 23.08.2020