将带有方法的类添加到程序集中
本文关键字:程序 程序集 集中 添加 有方法 | 更新日期: 2023-09-27 18:13:59
我正试图将一个新类添加到具有1个方法调用的程序集中,我试图从该程序集中的其他地方调用该方法。目前我有以下内容:
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操作码时插入对我创建的方法的调用。这个插入可以正常工作,但是当调用方法时,我在程序集中得到这个错误,我将这些调用插入到:
系统。typeloadeexception:无法加载类型。因为父组件不存在,所以从程序集中调用WinFormsTest。
有谁知道是什么原因导致的吗?
一个老问题,但这里有答案:
新建的typedefinition将其BaseType prop设置为null,这对类无效。尝试将其设置为typessystem。对象。