用Emit技術替代反射

System.Reflection.Emit命名空間類可用于動態發出Microsoft中間語言(MSIL)代碼,以便生成的代碼可以直接執行。反射也用于獲取有關類及其成員的信息。換句話說,反射是一種技術,允許您檢查描述類型及其成員的元數據,你可能以編程方式訪問過組件對象模型類型庫, .NET中的反射非常相似,但功能強大且易于使用。使用.NET編譯器編譯源文件時,編譯器會產生源文件中語句中的MSIL代碼以及描述文件中定義的類型的元數據。正是這個元數據,.NET中的反射API使你能夠檢查。在這個System.Reflection命名空間中,有一些類可用于幫助訪問程序中固有的結構,比如類、類型、字段、結構、枚舉、成員和方法。例如,您使用Type類來標識所反映的類的類型,FieldInfo類表示結構或枚舉的字段。MemberInfo類表示反射類的成員,并使用MethodInfo類表示反射類的方法。PrimeRealFipe類表示反射類中的方法的參數。

使用System.Reflection.Emit命名空間類在可以編譯時創建代碼,但前提是必須懂IL代碼。(本文不做IL代碼詳解,因為我也不會。。。)事實上,你實際編寫的是就是幕后的MSIL本身。你可以使用反射在內存中定義程序集,為該程序集創建類/模塊,然后為該模塊創建其他模塊成員和新類型。你同樣也可以使用Emit來構造程序集。Reflection.Emit是一個強大的命名空間,我們可以在運行時動態地發出瞬態和持久化程序集。Reflection.Emit產生一個低級,語言中立的MSIL。通常,我們通過將源代碼保存到磁盤然后編譯該源代碼來創建程序集,然后我們調用我們需要從該程序集中使用的類的方法,該程序集是在磁盤上編譯的。但是你可以想象,這涉及額外的磁盤寫入和讀取工作!使用反射生成代碼,我們可以省略此開銷并立即將操作代碼直接發送到內存中。反射發射只不過是直接在代碼中編寫任何匯編代碼,然后即時調用生成的代碼。這也并不是說反射效率就是高,因為在運行期產生指令也是需要時間,各有優缺點。

System.Reflection.Emit命名空間提供用戶動態創建.exe文件所需的類。它的類允許編譯器或工具發出元數據和MSIL。因此,您可以動態地在磁盤上創建.exe文件,就像運行代碼,保存代碼并調用編譯器來編譯代碼一樣。大多數情況下,您需要此功能和此命名空間用于自定義腳本引擎和編譯器。
Reflection.Emit命名空間有許多可用于重要的的類。以下是兩個最重要的:

??? AssemblyBuilder類是在運行時發出代碼并具有創建動態模塊的方法的任何應用程序的起點。
??? ModuleBuilder類用作在運行時向動態程序集添加類和結構等類型的起點。

生成MSIL指令的ILGenerator.OpCodes類包括其所需字段中的所有IL指令。MSIL是CLR或中間語言的基本匯編語言的無類型操作代碼。當您編寫任何C#代碼并對其進行編譯時,它將首先轉換為MSIL。然后,當您在MSIL中調用程序集時,它將以相應的機器語言進行轉換和執行。學習MSIL的最簡單方法是反匯編您編譯的簡單代碼。您可以使用.NET SDK實用程序之一ILDasm.exe(IL反匯編程序)在Vs插件庫下載即可,來反匯編任何已編譯的.NET代碼。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537338.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537338.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537338.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

windows安裝TortoiseGit詳細使用教程

windows安裝TortoiseGit詳細使用教程【基礎篇】_小飛牛的技術博客_51CTO博客windows安裝TortoiseGit詳細使用教程【基礎篇】,環境:win8.164bit安裝準備:首先你得安裝windows下的git msysgit1.9.5安裝版本控制器客戶端tortoisegit tortoisegit…

keras中文文檔_【DL項目實戰02】圖像識別分類——Keras框架+卷積神經網絡CNN(使用VGGNet)

版權聲明:小博主水平有限,希望大家多多指導。目錄:【使用傳統DNN】BG大龍:【DL項目實戰02】圖像分類——Keras框架使用傳統神經網絡DNN?zhuanlan.zhihu.com【使用卷積神經網絡CNN】BG大龍:【DL項目實戰02】圖像識別分…

Java Html轉pdf實戰

Java Html轉pdf實戰 - 簡書年尾手頭沒啥事,干起了打雜工作,最近幫忙解決后端項目里一個html批量轉pdf速度慢的問題,項目里用到的轉換工具是 wkhtmltopdf ,這貨轉單個html還好,批量轉速...https://www.jianshu.com/p/d0…

Hadoop生態圈-Ambari控制臺功能簡介

Hadoop生態圈-Ambari控制臺功能簡介 作者:尹正杰 版權聲明:原創作品,謝絕轉載!否則將追究法律責任。 在經歷一系列安裝過程之后(部署過HDP后我終于發現為什么大家喜歡用它了,部署比CDH簡單是他優勢之一&…

oracle監聽啟動很慢

TNS-12531: TNS:cannot allocate memory 首先查看內存,free -m 發現當前的空閑內存還有很多,那就不是內存不足的問題 想到之前重啟過數據庫服務器,查看主機名hostname,然后在查看etc/hosts 中的主機名,發現兩者不一致,…

python地圖標注_Python 給定的經緯度標注在地圖上的實現方法

博主最近發現了python中一個好玩的包叫basemap,使用這個包可以繪制地圖。值得說一下的是,basemap還沒有pip檢索,因此不能直接使用pip install basemap,來安裝這個包。所以需要自己把下面兩個包自行下載,然后在該目錄下使用pip安裝…

剪映專業版PC端清理緩存與日志

清理緩存 這個簡單,在全局設置里,點擊刪除鍵,就可以 清理日志 軟件每次剪輯都會生成日志,日志路徑在 C:\Users\zengm\AppData\Local\JianyingPro\User Data\Log C:\Users\zengm\AppData\Local\JianyingPro\User Data\VELog

nodejs源碼_nodejs之setTimeout源碼解析

setTimeout是在系統啟動的時候掛載的全局函數。代碼在timer.js。function setupGlobalTimeouts() {const timers NativeModule.require(timers);global.clearImmediate timers.clearImmediate;global.clearInterval timers.clearInterval;global.clearTimeout timers.clear…

百度網盤PC端緩存文件夾

在C:\Users\zengm\AppData\Roaming\baidu\BaiduNetdisk\users\下面 BaiduYunCacheFileV0.db 文件為百度網盤目錄數據,結構為: 百度網盤BaiduYunCacheFileV0.db數據庫研究_wqq1027的博客-CSDN博客_百度網盤數據庫最近研究了一下百度網盤的本地數據庫文件…

python 圖片轉文字錯誤_python3把base64字符串寫成圖片文件出錯

下面的代碼在python2下正常的,是一個微信圖標,文件md5是a1be719025844a1918ec6a338eaa8456我對python3不熟悉,不知道要怎么改#!/usr/bin/python3import base64def filePutContents(file, content):fp open(file, a)fp.write(content)fp.clos…

從業回憶錄,最后悔的事

被一篇文章誤導 我清楚地記得,在我畢業第一年,我看到了一篇關于程序員怎么學技術的文章,觀點是程序員要多學技術,文章引用了典故:“高筑墻,廣積糧,緩稱王”。當時讀這篇文章,感覺很有道理,認同了文章里的觀點。 這么些年,學了不少技術:C#、Asp.net、Java Web套餐、A…

kodexplorer開源網盤php程序配置解析

config/setting_user.php 追加內容(一下都是,注意不要使用中文引號、雙引號及分號) //【指定多語言只保留中文】 $GLOBALS[config][settings][language] zh-CN; //【自定義群組創建時自動新建的目錄】 $GLOBALS[config][settingSystemDefaul…

實現三元組表示的兩個稀疏矩陣的加法_K-BERT | 基于知識圖譜的語言表示模型

1.研究背景BERT曾被應用在多項NLP任務中,并且取得了很好的結果。它通過在大規模開放語料庫上進行預訓練以獲得通用的語言表示,然后在特定的下游任務中進行微調,吸收特定領域的知識。但這些模型在不同的領域執行知識驅動任務時,效果…

Excel單元格“刪除線”的添加與刪除

軟件:windows,WPS 點擊字體設計的小角標,進入更多設置,勾選“刪除線”

excel 表格復制到word后,寬超出word如何調整?

網上很多方法是用“選擇性粘貼----excel表格對象”,這個適用表格行數少的,不超過一頁word的。 步驟 復制到word里后,選中表格,右鍵---自動調整--選擇具體的調整方式。 調整后效果

sql 查詢上個月的數據_數據分析-SQL 進階篇 多表查詢

知識點一、表的加法Union:刪除表中的重復值union al:包含表中所有內容,包括重復值二、表的聯結聯結:join聯結分為以下五種:交叉聯結(cross join)又稱為笛卡爾積:將表中的每一行與另外…

jenkins部署三種構建方式的詳細步驟

部署背景:jenkins: CentOS 7.4C IP:172.16.3.74gitlab-11.5.3: CentOS 7.4D IP:172.16.4.74此上部署都是根據我之前的博客配置完成的;jenkins有三種構建方…

從業回憶,一次大膽的冒險,程序員轉崗項目經理

有些事不必知道得太早 程序員這個行業,被“中年危機”言論導向后,就和洗腳城女技師差不多,年輕,漂亮,技術好,體力好的技師收入高,一邊拿著高薪,賺著外快,一邊吐槽是青春飯,經常熬夜,干不長久。 2010年之前,網上宣傳程序員是青春飯,程序員中年危機的文章很少。近幾…

python中控腳本_Python3.7實現中控考勤機自動連接

由于考勤機與oa對接,oa會在每天定時取考勤機數據,但是需要考勤機是連接狀態,所以搜索了下相關教程,寫了個腳本自動連接。完全是個python小白,代碼爛,僅作為筆記。理論上支持所有程序的每天自動開啟與關閉# …