gpt4 book ai didi

c# - Mono Cecil 将带有方法的类添加到程序集中

转载 作者:太空狗 更新时间:2023-10-30 01:35:41 25 4
gpt4 key购买 nike

我正在尝试将一个新类添加到一个程序集中,其中有 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 操作码时插入对我创建的方法的调用。此插入工作正常,但是当调用该方法时,我在程序集中收到此错误,我已将这些调用插入到:

System.TypeLoadException: Could not load type . from assembly WinFormsTest because the parent does not exist.

有没有人知道可能导致这种情况的原因?

最佳答案

一个老问题,但这里是答案:

新构造的 TypeDefinitions 将其 BaseType 属性设置为 null,这对类无效。尝试将其设置为 TypeSystem.Object。

关于c# - Mono Cecil 将带有方法的类添加到程序集中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24852885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com