Tag: 中间语言

在IL中看起来像什么?

if语句在编译成IL时会是什么样子? 这是C#中一个非常简单的构造。 sombody可以给我一个更抽象的定义,它究竟是什么?

接口作为类型约束和接口作为参数之间的区别?

如果我想创建一个将IList实例作为参数(或任何其他接口,但让我们使用IList作为示例)的方法,我可以创建一个带有类型约束的generics方法,例如: public static void Foo1(T list) where T : IList { } 或者,我可以创建一个直接获取IList参数的方法: public static void Foo2(IList list) { } 出于所有意图和目的,似乎这些方法的行为完全相同: List myList = new List(); Foo1(myList); Foo2(myList); 所以这是我的问题 – 这两种方法之间的区别是什么? 似乎第二种方法稍微可读; 我应该注意哪些其他差异(生成不同的IL等)? 提前致谢。

哪些工具执行IL的后编译修改?

最近提到的PostSharp让我想起了这个: 去年我工作的地方,我们正在考虑使用PostSharp将检测注入我们的代码中。 这是在Team Foundation Server团队构建/持续集成环境中。 考虑到这一点,我对PostSharp的操作方式产生了一种唠叨的感觉 – 它编辑了编译器生成的IL。 这让我感到困扰。 我并不担心PostSharp不能正常工作; 我很担心这是我第一次回忆起这样的工具。 我担心其他工具可能不会考虑到这一点。 事实上,随着我们前进,我们确实遇到了一些问题,因为PostSharp对原始IL所处的文件夹感到困惑。这打破了我们的构建。 它似乎是由于与MSBUILD目标的冲突解决了项目引用。 冲突似乎是由于PostSharp使用临时目录来存储IL的未修改版本。 无论如何,我当时没有StackOverflow来引用! 既然我这样做了,我想问你们所有人是否知道编辑IL作为构建过程的一部分的任何其他工具; 或者Microsoft是否在Visual Studio,MSBUILD,Team Build等中考虑了这种工具。 更新:感谢您的回答。 最重要的是,至少在VS 2010中,微软真的应该意识到这种事情会发生。 因此,如果在VS2010中存在这方面的问题,那么微软可能会分担责任。

Mono.Cecil可以修改已经加载在AppDomain中的代码吗?

我想在运行时向某个类添加一些行为。 我知道如何在运行时使用Reflection.Emit进行子类化,但这还不够,根据一些外部配置,我需要在类型T上的方法中注入操作码,以便从中inheritance的所有类自动获得此行为。(我无法使用.NET分析API) 可以用Mono.Cecil完成这样的事吗? 如果不能修改加载的程序集上的代码,那很好如果我可以在加载程序集之前进行修改然后将修改后的程序集加载到内存中,但我不知道如何控制程序集加载。

实际铸件在CLR级别如何工作?

在进行向上或向下投射时,幕后真的会发生什么? 我有一个想法,当做某事时: string myString = “abc”; object myObject = myString; string myStringBack = (string)myObject; 最后一行中的强制转换只会告诉编译器我们是安全的,我们没有做错任何事。 所以,我认为实际上代码本身不会嵌入任何强制转换代码。 看来我错了: .maxstack 1 .locals init ( [0] string myString, [1] object myObject, [2] string myStringBack) L_0000: nop L_0001: ldstr “abc” L_0006: stloc.0 L_0007: ldloc.0 L_0008: stloc.1 L_0009: ldloc.1 L_000a: castclass string L_000f: stloc.2 L_0010: ret 为什么CLR需要类似castclass string东西? 向下转换有两种可能的实现方式: 你需要一个castclass […]

.NET IL .maxstack指令如何工作?

我想知道.maxstack是如何工作的。 我知道它与您声明的类型的实际大小无关,但与它们的数量有关。 我的问题是: 这仅适用于函数,还适用于我们要求的所有函数? 即使只是函数是.maxstack正在声明,如果你有分支,你怎么知道maxstack是什么? 你去看看所有的“路径”并尽可能返回最大值? 如果我将它设置为16并且实际上有17个变量会发生什么? 如果我把它设置为256,会有太大的惩罚吗?