微软伪造的Shims在内部是如何工作的?

7

我对它的实现方式很感兴趣。 基本上:我如何重新实现同样的东西? ......但我并不打算这么做。只是想理解。

基本问题是: 如何才能 (?) 拦截类实例化? 在一个情况下如何用一个实现替换另一个实现,在另一个情况下如何用原始实现或甚至不同的实现替换它?

如何才能拦截静态方法或密封类。

所有这些都与shims/moles有关,与stubs不太相关。


微软使用最黑暗的神秘魔法解决了这个问题。 - Gusdor
我不清楚“Microsoft Fakes的shims”在这里指的是什么意思 - 你能否请澄清一下? - Sander
@Sander:Microsoft Fakes是自VS2012起包含的一款用于单元测试的优质工具。其主要特点是shims和stubs。 - Robetto
1个回答

6
这是通过更改编译器发出的通用中间语言(IL)代码来实现的。您可以使用Fody库进行预打包IL修改。Fody内部使用mono.cecil库进行低级别IL操作。编译器生成的IL被修改并保存到磁盘作为程序集。
我在Moles参考文献中找到了有关代码仪表化机制的说明。第4节解释了其原理。

你确定吗?Shimmed 方法比原始对象慢得多。 - Gusdor
1
在答案中提到的PDF中,我找到了以下核心解释: 仪器是按照以下方式完成的。在每种方法的开始处插入一些代码。此代码查询低级别的 detours 库,以确定是否将任何 detour 附加到此特定方法。如果是,则调用detour委托,否则执行正常代码。 - Robetto

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