Откройте DLL и перепишите
Существует библиотека DLL, которая создается при компиляции одной из моих программ. DLL содержит изображения, которые отображает программное обеспечение. Я сделал другое программное обеспечение, конфигуратор. Я хочу, чтобы он мог открывать DLL, заменять баннер, и только баннер, изображение с любым изображением, которое выберет пользователь, а затем перекомпилировать в dll. Как я могу это сделать?
5 ответов
Для этого существуют санкционированные Microsoft стратегии, в частности, разделы ресурсов образа PE.
Тем не менее, я бы порекомендовал иметь большой массив в C, который начинается с определенной магической последовательности и распространяется на известный размер. Затем, при замене массива, найдите магическую последовательность и просто замените байты в DLL.
Вы, вероятно, хотите работать с ресурсами API - UpdateResource и друзьями.
Посмотрите на Моно - Сесил. Cecil - это инструмент (API), который позволяет изменять / переписывать IL-код сборок. Следует также переписать ресурсы.
Вероятно, вам следует рассмотреть возможность компиляции DLL на лету с использованием встроенного компилятора C# или VB.NET, доступного в.NET. Точными классами, реализующими компиляторы, являются Microsoft.CSharp.CSharpCodeProvider и Microsoft.VisualBasic.VBCodeProvider. Оба определены в сборке System.dll.
Кроме того, вы также можете использовать приложения csc.exe, vbc.exe и resgen.exe, установленные вместе с.NET Framework, для создания DLL.
Это может быть сделано через порождение процесса с использованием класса System.Diagnostics.Process. Используя это, вы можете захватывать потоки Console.In и Console.Out для перенаправления консольного ввода-вывода в StreamReader/StreamWriter для тесной интеграции с функцией Configurator.
Сказав это, я думаю, что лучшим вариантом является первый, когда вы используете реальные классы компилятора, а не вызываете исполняемые файлы (которые внутренне просто вызывают классы компилятора тоже).
Если все остальное терпит неудачу, есть проект конструктора компилятора на CodePlex, который мог бы быть полезным. У него есть такие вещи, как классы PEAssemblyReader и PEAssemblyWriter (не слишком точные в отношении точных имен), но классы позволяют читать и записывать PE-файлы. PE обозначает переносимый исполняемый файл и является форматом, используемым Windows для исполняемых файлов. Однако в этом варианте вам необходимо точно знать, как изменить структуру PE в памяти, и они запишут измененную структуру PE.
Я все еще думаю, что первый вариант - тот, который нужно использовать, если только у вас не будет доступных источников для этих DLL во время выполнения.
Имейте в виду, что любой подход, связанный с этим, будет иметь побочные эффекты - в частности, он нарушит любую подпись кода в сборке.
Вы можете рассмотреть возможность иметь отдельный файл ресурсов, который загружает ваша сборка. Это делает тривиальным обновление. Вы даже можете использовать некоторую форму простой БД, если у вас есть несколько ресурсов.