在.NET Windows Store应用程序API中,Emit.OpCodes的目的是什么?

14

我正在考虑将第三方库移植到.NET for Windows Store apps。该库通过调用ILGenerator.Emit方法重度使用System.Reflection.Emit.OpCodes

.NET for Windows Store Apps API包含了OpCode结构和OpCodes类,但没有ILGenerator类,据我所知也没有替代品。

显然我缺少了什么,但是:没有ILGenerator类,那么在.NET for Windows Store apps API中包含System.Reflection.Emit.OpCodeOpCodes的目的是什么?


3
好问题,但不太可能被很多人回答。我能提出的只是它们仍然因为某些内部目的而需要,并且在暴露它们方面没有什么“伤害”(就像LocalVariableInfo可用一样,但我还没有找到一个合理的方法来获取它)。 - Damien_The_Unbeliever
1
@Damien_The_Unbeliever 非常感谢您更仔细地研究这个问题。我自己对 Reflection.Emit 命名空间的经验很少,所以我想问一下,但显然并不立即明显为什么只有 OpCodeOpCodes 仍然可用 :-) - Anders Gustafsson
1
如果你需要替代 ILGenerator.Emit 的工具,可以看看 Mono-Cecil。我自己没有使用过,但其他人将其用作表达式树解释器:http://www.mono-project.com/Cecil - Philipp Aumayr
@PhilippAumayr 非常感谢您提出这个有趣的建议。我进行了快速的谷歌搜索和Nuget测试,目前似乎Cecil在WinRT上并不是立即可用的。不确定移植需要多少工作量,但我也可能会研究一下这个问题。 - Anders Gustafsson
2个回答

1
很好的问题。虽然我不能确定,但我只能想到两个使用OpCode / Opcodes的原因(我真的无法想象它被用于其他事情):
  1. 使用ILGenerator汇编代码片段
  2. 使用MethodInfo.GetMethodBody之类的方法对代码片段进行反汇编,然后解析包含IL代码的字节
既然不是前者,我猜他们在使用后者。这种应用程序的静态代码分析;我自己使用它来实现一些Mocking行为,并找出传递给它的lambda表达式是什么(在这种情况下,无法使用表达式)。在这种情况下可能更有可能的代码分析应用程序是检查是否使用了禁止使用的某些类/方法/结构(我可以想象他们不希望您使用某些功能)。

除了后者在Windows商店中也不可用。 - Damien_The_Unbeliever
1
但是所有获取IL字节的框架方法似乎都被封锁了。是的,您可以手动反汇编 - 就像您自己定义OpCodes一样,如果您打算这样做。 - Damien_The_Unbeliever
@StefandeBruijn 有趣的方面,但正如Damien所指出的那样,MethodInfo.GetMethodBodyMethodBody类在*.NET for Windows Store apps中不包括。你会考虑在Windows Store app*中进行(手动)反汇编吗?这似乎更相关于常规的.NET Framework应用程序。 - Anders Gustafsson
1
是的,但如果商店提交流程实际上使用相同的库(似乎正在进行此类分析),那么这是有道理的。很明显,他们试图删除Emit代码 - 但是如果您是微软,并且这是未来可能发生变化的事情,这不是您想要重新定义的事情。但老实说,我只是在猜测。。。 - atlaste
@StefandeBruijn 感谢您更仔细地研究了这个问题。正如您所提到的,似乎OpCodes的包含是为潜在未来做准备。我们将拭目以待。 - Anders Gustafsson
显示剩余3条评论

1
你可能会发现 Mono Cecil 对于替换 System.Reflection 的某些功能很有用。虽然官方没有为 WinRT 提供其移植版,但非官方的移植版在这里是可用的,只需注意它基于 Mono Cecil 的 Silverlight 版本。
还要注意,你无法在应用程序包之外修改 dll 和 exe 文件,这是 WinRT 沙箱的安全措施。

谢谢,@Rafael,我会再仔细看一下。 - Anders Gustafsson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接