Dnlib - Не заменяются строки констант
В Исходном файле (который изменяем) есть такая строка:
public const string Test = "{ConstText}";
Её я пробую изменять этим методом, ищу строку и пробую её изменить.
var module = ModuleDefMD.Load(/* ... */);
foreach (var type in module.GetTypes().Where(t => t.HasMethods))
{
foreach (var method in type.Methods.Where(m => m.HasBody))
{
IList<Instruction> instr = method.Body.Instructions;
for (int i = 0; i < instr.Count; i++)
{
if (instr[i].OpCode == OpCodes.Ldstr) // string'овые опкоды
{
if (instr[i].Operand.ToString().Contains("{ConstText}")) // Что ищем и заменяем
{
instr[i].Operand = "NewText"; // На что заменяем
}
}
}
}
}
Но оно не изменяется почему-то. Видимо из-за const, но если я уберу и сделаю так:
public static string Test = "{ConstText}";
То так изменяется.
Как изменить текст константы?
Смог найти константу через поиск по полям:
var list = new StringBuilder();
try
{
using (var module = ModuleDefMD.Load(Resources.Stub))
{
foreach (var type in module.GetTypes().Where(t => t.HasMethods))
{
IList<FieldDef> fieldstr = type.Fields;
for (int i = 0; i < fieldstr.Count; i++)
{
list.AppendLine($"FieldType: {fieldstr[i].FieldType}");
list.AppendLine($"Name: {fieldstr[i].Name}");
list.AppendLine($"FullName: {fieldstr[i].FullName}");
list.AppendLine($"DeclaringType: {fieldstr[i].DeclaringType}");
list.AppendLine($"GetType: {fieldstr[i].GetType()}");
continue;
}
}
}
}
catch { }
File.WriteAllText("listCLI.txt", list.ToString());
fieldstr[i].Name - это наши константы.