Tag: inline

内联MSIL / CIL

我创建了以下简单方法: public static void Main () { Console.WriteLine(“Hello world!”); Console.ReadKey(true); } 然后我使用ILSpy来获取MSIL代码: .method public hidebysig static void Main() cil managed { .entrypoint .maxstack 8 nop ldstr “Hello world!” call void [mscorlib]System.Console::WriteLine(string) nop ldc.i4.1 call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey(bool) pop ret } 最后,我尝试使用我在这里找到的#if IL技巧将MSIL代码写入我的C#代码。 public static void Main () { #if IL nop ldstr “Hello world!” call […]

为什么我的方法调用Assembly.GetCallingAssembly()不是JIT内联?

我正在尝试制作一个简短的C#代码段,它将说明由于MSDN中概述的JIT内联而更改Assembly.GetCallingAssembly()行为。 到目前为止,这是我的代码: class Program { static void Main(string[] args) { Console.WriteLine( GetAssembly().FullName ); Console.ReadLine(); } static Assembly GetAssembly() { return System.Reflection.Assembly.GetCallingAssembly(); } } 我在“Release”中构建并开始使用“Start Without Debugging” – 这个设置使得这个答案的代码产生内联。 我看到的结果是 ConsoleApplication2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 很明显GetAssembly()没有内联到Main() ,否则我会看到mscorlib作为调用程序集。 我已经查看了所有内联标准,但我不明白为什么不会内联GetAssembly() 。 是否有可能知道为什么JIT编译器决定不内联调用?

F#内联如何工作?

使用F#,我理解您可以使用inline关键字在呼叫站点执行类型特化。 那是:: val inline (+) : ^a -> ^b -> ^c when (^a or ^b) : (static member (+) : ^a * ^b -> ^c) 约束^a或^b必须具有静态成员,如op_Addition或其中一个内置基元,可用于填补空白。 因此,如果你有一个方法有一个+,你传入一个int和一个short作为参数,它解包+一个指令使用int的内置原语,如果你传入一个浮点数和一个字节,它使用浮点数原始加法操作码。 这在编译时是如何完成的? 你怎么能在CLR中有一个方法根据类型切换它使用的操作码或方法? Reflection.Emit可以实现这种行为吗? 我知道内联是在调用站点执行的,这是否意味着代码不能与C#一起使用?