【问题标题】:How to create a GenericParameter return type for a MethodReference in Mono.Cecil?如何在 Mono.Cecil 中为 MethodReference 创建 GenericParameter 返回类型?
【发布时间】:2023-04-01 21:18:01
【问题描述】:

我正在尝试使用 Mono.Cecil 重现以下 IL:

call !!0 [mscorlib]System.Threading.Interlocked::CompareExchange<class [System]System.ComponentModel.PropertyChangedEventHandler>(!!0&, !!0, !!0)

当我使用 Mono.Cecil 检查这个 IL 时,我看到指令的操作数是一个 GenericInstanceMethod,它包含一个 MethodReference 类型的 ElementMethod。此 MethodReference 又具有 GenericParameter 类型的返回类型。

我想手动创建相同的对象,但似乎达到了 catch-22。要创建 GenericParameter,我需要一个 IGenericParameterOwner,它似乎与上面的 MethodReference 完全相同。所以我想将 MethodReference 传递给 GenericParameter 构造函数。但是,如果没有返回类型的 TypeReference,我也无法创建 MethodReference,我认为它应该是 GenericParameter。

我该如何解决这个问题?我误会了什么?

【问题讨论】:

    标签: .net il mono.cecil


    【解决方案1】:

    这似乎是 API 的问题。

    解决此问题的一种简单方法是将 TypeReference 作为 MethodReference 的 ReturnType 传递给 void,并将 ReturnType 更改为稍后创建的 GenericParameter。

    【讨论】:

    • 啊,你的意思是我可以做这样的事情? var elementMethodRef = new MethodReference("CompareExchange", _voidTypeRef); var genParam = new GenericParameter("!!0", elementMethodRef); elementMethodRef.ReturnType = genParam;
    • @Einar 是,然后 elementMethodRef.GenericParameters.Add(genParam);
    • 太棒了,那是缺失的部分!谢谢!
    • 哦,看来我还是有些问题,我应该为泛型参数提供一个“类[System]System.ComponentModel.PropertyChangedEventHandler”类型,现在好像是空的还是无效的?
    • 啊,没关系,我现在明白了,我需要将 GenericArgument 传递给 GenericInstanceMethod。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2020-03-19
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多