我正在尝试使用一个方法调用将一个新类添加到一个程序集中,我试图从此程序集中的其他位置调用。目前我有以下内容:
ParameterDefinition param = new ParameterDefinition("Param", ParameterAttributes.None, mod.Import(typeof(string)));
Collection<Instruction> methodInstructions = new Collection<Instruction>();
methodInstructions.Add(Instruction.Create(OpCodes.Ldarg_0));
methodInstructions.Add(Instruction.Create(OpCodes.Ret));
MethodDefinition newMtd = MethodCreator.CreateMethod("ExampleMethod", mod, methodInstructions, param, typeof(string));
// Lets add the new method to the module entrypoint declaring type
TypeDefinition Class = new TypeDefinition("MyNamespace", "MyNewClass", TypeAttributes.Class);
mod.Types.Add(Class);
Class.Methods.Add(newMtd);
这会按预期创建新方法和类,这可以在.net反射器中看到。所有这个方法都会返回传递的参数(这是预期的结果)。我试图使用以下代码调用此方法:
public void InsertCalls(MethodDefinition methodToInsertCallsTo, MethodDefinition methodToCall)
{
ILProcessor ilp = methodToInsertCallsTo.Body.GetILProcessor();
for (int i = 0; i < methodToInsertCallsTo.Body.Instructions.Count; i++)
{
if (methodToInsertCallsTo.Body.Instructions[i].OpCode == OpCodes.Ldstr)
{
Instruction loadString = methodToInsertCallsTo.Body.Instructions[i];
ilp.InsertAfter(loadString, Instruction.Create(OpCodes.Call, methodToCall));
}
}
}
所以这一切都是在每次遇到Ldstr操作码时插入对我创建的方法的调用。这个插入工作正常,但是当调用该方法时,我在程序集中得到了这个错误,我将这些调用插入到:
System.TypeLoadException:无法加载类型。从汇编WinFormsTest,因为父级不存在。
有没有人对可能导致这种情况的原因有任何想法?
答案 0 :(得分:3)
一个老问题,但答案是:
新构造的TypeDefinitions将其BaseType prop设置为null,这对于类无效。尝试将其设置为TypeSystem.Object。