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

Могу ли я изменить значение константы в С#?

Мне нужен этот взлом для старой DLL.NET, которую нельзя перекомпилировать. Некоторые взломы, например. используя отражение и т.д.

4b9b3361

Ответ 1

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

Чтобы разобрать исходный код, вы можете использовать reflector (предупреждение - больше не бесплатное) с плагин Dennis Bauers или вы можете использовать reflexil, который является другим плагином для отражателя, который поставляется с полный редактор VB/С# и intellisense, позволяющий вводить код непосредственно из Reflector.

чтобы разобрать IL, вы можете использовать ILSpy дизассемблер или MSILDissasembler

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

Другое, что очень важно, заключается в том, что если константа используется другими dll, которые ссылаются на dll, которые вы перекомпилируете с компиляцией, эти dlls НЕ ПОДНИМАЮТ НОВУЮ СТОИМОСТЬ ПОСТОЯННОГО БЕЗ ТАКЖЕ РЕКОМЕНДУЕМОГО.

Это связано с тем, что, когда что-то определено как константа, значение константы выпекается в ссылочной DLL как оптимизация (поэтому ее не нужно искать в соответствующей dll-ссылке каждый раз, когда она используется) AT BUILD TIME, поэтому изменения значения "константа" никогда не наблюдаются в каких-либо библиотеках, ссылающихся на "константа". См. этот вопрос и ответы на некоторые подробности.

Ответ 2

Добавление к ответу Stecya:
Значение константной переменной будет вставлено в любом месте, где оно используется. Это означает, что все сборки, ссылающиеся на вашу устаревшую сборку и использующие эту константу, должны быть перекомпилированы также для отражения обновленного значения константной переменной. Это BTW является причиной того, что это хорошая идея всегда выставлять постоянные значения через обычные свойства в публичных интерфейсах.

Ответ 3

Вы не можете изменить const, потому что вычисляется время компиляции. Только путь заключается в том, чтобы изменить эту константу, чтобы изменить эту устаревшую сборку.

Ответ 4

Отражения не будут работать, потому что это значение жестко закодировано в байтовый код приложения таким образом, что отражения не смогут быть изменены.

Если код не подписан, используйте шестнадцатеричный редактор или ILDasm для изменения значения константы.

Если это код подписан, у вас нет возможности решить эту проблему без предварительного подписания кода.

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

Ответ 5

значения const заменяются как литералы во время компиляции, поэтому маловероятно, что вы сможете изменить его без перекомпиляции