【发布时间】:2015-08-27 07:48:32
【问题描述】:
我正在尝试使用 Mono Cecil 来操作 DLL。我想做的是将一些类的基本类型从mscorlib.dll 设置为System.MarshalByRefObject。我正在使用以下代码。
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 时,它正确设置了基本类型。
我相信我所做的与this reply 对代码项目文章"Reweaving IL code with 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);
这应该很容易!我做错了什么?
【问题讨论】:
-
我意识到有人问了一个相关的问题:stackoverflow.com/questions/22911825/… .. 请帮忙!!!
-
如果之前有人问过同样的问题,如您所说,那么您的问题是重复的,应该关闭。
标签: c# .net mono mono.cecil