Могу ли я изменить значение константы в C #? - PullRequest
17 голосов
/ 30 мая 2011

Мне нужен этот хак для устаревших .NET DLL, которые не могут быть перекомпилированы.Некоторые взломать, например, используя отражение и т. Д.

Ответы [ 5 ]

17 голосов
/ 30 мая 2011

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

Для разборки с источником вы можете использовать отражатель (предупреждение больше не бесплатно) с плагином Денниса Бауэрса или выможно использовать reflexil , который является другим плагином для отражателя, который поставляется с полным редактором VB / C # и intellisense, позволяющим вводить код непосредственно из Reflector.

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

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

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

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

10 голосов
/ 30 мая 2011

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

3 голосов
/ 30 мая 2011

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

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

Если код подписан, у вас нет способа решить эту проблему без предшествующей подписи кода.

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

3 голосов
/ 30 мая 2011

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

1 голос
/ 30 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...