最近幾天有幸得到閃電大哥的指點,了解了EMIT和IL中的一些指令。雖然有高射炮打蚊子的說法,但是我相信“二八定律”,80%的功能可以用20%的技術解決,20%的功能只能用80%的技術解決。大哥的博客:http://www.cnblogs.com/qldsrx/p/4542496.html
在C#底層中,IL正發著耀眼的光芒。第一次完整的看到EMIT(反射的發出,基本就是用 代碼手寫IL,然後執行,效率最高,性能最好,編寫難度很大)是在閃電大哥的OWIN框架。閃電大哥自己封裝了OWIN的框架可以做webApi也可以做網站。寫得很好,用EMIT也做了大量的優化,在windows和linux都可以良好的運行,linux上在宿主jexus上完美運行,IIS更不用說。(項目地址:https://github.com/qldsrx/OwinFramework),用來做WebApi很好用的!
然後是IL中的棧,棧這個我理解成一個桶,這個桶可以放一定數量的圓餅,符合先進後出的原則。在做一些加減乘除的操作的時候,會彈出頂部兩個參數進行操作,操作後的結果將會重新壓人棧中。
int i=1; int j=2; int k=3; Console.WriteLine(i+j+k);
如上代碼編譯成IL後,是先會定義一個棧的大小,然後為三個變量分配內存,接著將值1,2,3分別載入到這些變量中。慢慢的再將索引第一個變量和索引第二個變量壓入棧,做add操作,得到值後壓入棧,接著將索引第三個變量壓入棧,再做add操作,並將結果壓入棧。最後是call函數Writeline,彈出棧頂部的參數傳入執行。當然,結束後要return。