.net - 是否可以将 Reflection.Emit 用于操作码 stelem.any 和 ldelem.any?

标签 .net reflection reflection.emit il dynamicmethod

所以,我最近做了一些实验,发现 Reflection.Emit 似乎并不支持 ECMA 规范中的所有操作码。缺少 3 个操作码:

  • ldelem.any
  • stelem.any
  • no. (前缀)

  • Reflection API 不支持这些操作码,还是有某种方法可以生成它们?

    最佳答案

    事实上,你可以。

    http://msdn.microsoft.com/en-us/library/4xxf1410.aspx 有精彩的演练

    两个重要部分是:

    创建通用参数:

    string[] typeParamNames = {"TFirst", "TSecond"};
    GenericTypeParameterBuilder[] typeParams = 
        myType.DefineGenericParameters(typeParamNames);
    
    GenericTypeParameterBuilder TFirst = typeParams[0];
    GenericTypeParameterBuilder TSecond = typeParams[1];
    

    然后创建方法:
    Type listOf = typeof(List<>);
    Type listOfTFirst = listOf.MakeGenericType(TFirst);
    Type[] mParamTypes = {TFirst.MakeArrayType()};
    
    MethodBuilder exMethod = 
        myType.DefineMethod("ExampleMethod", 
            MethodAttributes.Public | MethodAttributes.Static, 
            listOfTFirst, 
            mParamTypes);
    

    但是,您应该完全了解它,因为泛型参数以多种不同的方式和部分使用(在方法上、参数上、结果类型上、调用时……)。

    -update- 如果您想要 .NET 2 特定版本:http://msdn.microsoft.com/en-us/library/4xxf1410%28v=vs.80%29.aspx

    页面上的下拉菜单允许您选择可以在其中执行此操作的框架的多个版本。

    关于.net - 是否可以将 Reflection.Emit 用于操作码 stelem.any 和 ldelem.any?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13497586/

    相关文章:

    .net - 为什么不鼓励将程序集标记为 ComVisible(true)?

    asp.net - System.Reflection.Assembly.LoadFile 锁定文件

    c# - ILGenerator 属性不是实例

    c# - .NET 中用于 Windows 应用商店应用程序 API 的 Emit.OpCodes 的用途?

    scala - 列出所有可见的隐式

    c# - 尝试调用方法时出错

    .net - 使用 monotorrent : How do I add webseeds? 创建一个 torrent 文件

    .net - 您如何在进程中将 native 映射到 IL 指令指针

    c# - 如何通过 .NET 访问 ARP 协议(protocol)信息?

    C#:为什么我的应用程序不关闭其文件句柄?