Я пытаюсь использовать Mono Cecil для управления DLL. Что я хочу сделать, так это установить базовый тип некоторых классов на System.MarshalByRefObject
из mscorlib.dll
. Я использую следующий код.
var assembly = AssemblyDefinition.ReadAssembly(inputtarget);
var types = assembly.MainModule.Types;
var myTypesToChange = types.Where(...).Select(t => t);
var baseType = AssemblyDefinition.ReadAssembly(@"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscorlib.dll").MainModule.Types.Where(t => t.Name.Contains("MarshalByRefObject")).Select(t => t).First();
foreach (var myType in myTypesToChange)
{
myType.BaseType = baseType;
}
assembly.Write(outputtarget);
В выводе базовый тип не задан!
Когда я устанавливаю BaseType
в TypeReference
, выбранный из существующей сборки, он правильно устанавливает базовый тип.
Я считаю, что то, что я делаю, очень похоже на то, как это делается, как это предлагается в этот ответ на комментарий к статье Code Project Изменение кода IL с помощью Mono.Cecil:
Да, вы можете переписать базовый тип любого класса:
var assembly = AssemblyDefinition.ReadAssembly(AssemblyPath); var mainModule = assembly.MainModule; var companyType = mainModule.Types.First(t => t.Name == "Company"); var ownerType = mainModule.Types.First(t => t.Name == "Owner"); ownerType.BaseType = companyType; assembly.Write(AssemblyPath);
Это должно быть легко! Что я делаю неправильно?