Reflection in .net

最近在看設計模式的一些東西,在講到builder模式中使用到了c#的反射機制,從網上找了寫資料,整理如下:

?

C#中,我們要使用反射,首先要搞清楚以下命名空間中幾個類的關系:?
?System.Reflection命名空間
(1)??AppDomain:應用程序域,可以將其理解為一組程序集的邏輯容器
(2)??Assembly:程序集類
(3)??Module:模塊類
(4)??Type:使用反射得到類型信息的最核心的類
他們之間是一種從屬關系,也就是說,一個AppDomain可以包含NAssembly,一個Assembly可以包含NModule,而一個Module可以包含NType.?AppDomain這個類我們等下再來講解。我們先關注Assembly個類,在程序中,如果我們要動態加載一個程序集怎么辦呢?有幾種方式可以使用,分別是Load,LoadFromLoadWithPartialName三個Assembly的靜態方法.
???????先來講解Assembly.Load方法,該方法會有多個重載版本,其中一個就是提供程序集的詳細信息,即程序集的標識,包括程序集的名稱,版本,區域信息,公有密鑰標記,全部都是以一個字符串的形式提供,例如:"MyAssembly,Version=1.0.0.0,culture=zh-CN,PublicKeyToken=47887f89771bc57f”.
?????????????那么,使用Assembly.Load加載程序集的順序是怎樣的呢?首先它會去全局程序集緩存查找,然后到應用程序的根目錄查找,最后會到應用程序的私有路徑查找。
?????????????當然,如果你使用的是弱命名程序集,也即只給出程序集的名稱,那么這個時候,CLR將不會在程序集上應用任何安全或者部署策略,而且Load也不會到全局緩存程序集中查找程序集。
Assembly.Load("")的使用說明如下; ?
? 并不是命名空間。常用的是程序集名稱,也就是dll的名稱 ?
? ? 重載列表 ? ?
? 名稱 ? ? 說明 ? ? ?
? Assembly.Load ? (AssemblyName) ? ? 在給定程序集的 ? AssemblyName ? 的情況下,加載程序集。 ? ?
? 由 ? .NET ? Compact ? Framework ? 支持。?????
? Assembly.Load ? (Byte[]) ? ? 加載帶有基于通用對象文件格式 ? (COFF) ? 的圖像的程序集,該圖像包含已發出的程序集。將該程序集加載到調用方的域。 ? ? ?
? Assembly.Load ? (String) ? ? 通過給定程序集的長格式名稱加載程序集。?
? 由 ? .NET ? Compact ? Framework ? 支持。?????
? Assembly.Load ? (AssemblyName, ? Evidence) ? ? 在給定程序集的 ? AssemblyName ? 的情況下,加載程序集。使用提供的證據將該程序集加載到調用方的域中。 ? ? ?
? Assembly.Load ? (Byte[], ? Byte[]) ? ? 加載帶有基于通用對象文件格式 ? (COFF) ? 的圖像的程序集,該圖像包含已發出的程序集。 ? ? ?
? Assembly.Load ? (String, ? Evidence) ? ? 通過給定的程序集的顯示名稱來加載程序集,使用提供的證據將程序集加載到調用方的域中。
? Assembly.Load ? (Byte[], ? Byte[], ? Evidence) ? ? 加載帶有基于通用對象文件格式 ? (COFF) ? 的圖像的程序集,該圖像包含已發出的程序集。

?

關于反射Assembly.Load("程序集").CreateInstance("命名空間.類")
而不管在哪一層寫這段代碼其中的("程序集")讀取的實際是web層bin文件夾下的dll,也就是說你反射的類的程序集dll在web層的bin下必須有
注意CreateInstance()一定是命名空間.類名,否則創建的實例為空
Assembly.Load("程序集名")
Assembly.LoadFrom("程序集實際路徑"

http://space.itpub.net/12639172/viewspace-442007

最近看了一些關于C#反射的知識,估計也就最多達到使用API的程度,至于要深入了解,以現在的水平估計很難做到,所以下面此篇文章,以作為一個階段的總結。?
???????對于反射的總結,我想從以下幾個方面展開,首先是反射程序集,模塊,類的成員以及成員的一些信息;接下來就是動態調用類的成員方法;第三個方面就動態產生程序集,模塊和類以及類的成員。好了,現在就讓我們從反射各種信息開始吧?
???????C#中,我們要使用反射,首先要搞清楚以下命名空間中幾個類的關系:?
????????????? System.Reflection命名空間?
(1)???AppDomain:應用程序域,可以將其理解為一組程序集的邏輯容器?
(2)???Assembly:程序集類?
(3)???Module:模塊類?
(4)???Type:使用反射得到類型信息的最核心的類?
他們之間是一種從屬關系,也就是說,一個AppDomain可以包含NAssembly,一個Assembly可以包含NModule,而一個Module可以包含NType.?
?????? AppDomain這個類我們等下再來講解。我們先關注Assembly個類?
????????在程序中,如果我們要動態加載一個程序集怎么辦呢?有幾種方式可以使用,分別是Load,LoadFromLoadWithPartialName三個Assembly的靜態方法.?
????????先來講解Assembly.Load方法,該方法會有多個重載版本,其中一個就是提供程序集的詳細信息,即程序集的標識,包括程序集的名稱,版本,區域信息,公有密鑰標記,全部都是以一個字符串的形式提供,例如:"MyAssembly,Version=1.0.0.0,culture=zh-CN,PublicKeyToken=47887f89771bc57f”.?
??????????????那么,使用Assembly.Load加載程序集的順序是怎樣的呢?首先它會去全局程序集緩存查找,然后到應用程序的根目錄查找,最后會到應用程序的私有路徑查找。?
??????????????當然,如果你使用的是弱命名程序集,也即只給出程序集的名稱,那么這個時候,CLR將不會在程序集上應用任何安全或者部署策略,而且Load也不會到全局緩存程序集中查找程序集。?
???????測試加載弱命名程序集的例子如下:?
(1)???新建一個控制臺應用程序的工程,同時勾選創建解決方案?
(2)???在解決方案中新建一個類庫的項目,隨便寫一個類和一個方法?
(3)???在控制臺項目中,首先不添加引用,直接在Main方法中添加如下代碼:?
Assembly?assembly =?Assembly.Load("MyAssembly");?
??????????????? ??if?(assembly !=?null)?
???????????????? ?{?
????????????????????????Console.WriteLine("加載成功");?
?????????????????? }?
???????執行程序,會拋出異常,說找不到該程序集。什么原因呢?因為我們使用的是弱命名程序集,Load方法不會去全局程序集緩存中查找,而該應用程序目錄下又沒有該程序集,所以程序找不到。這個時候,我們把程序稍微改一下,不用添加代碼,只需添加對MyAssembly的引用,重新運行程序,加載成功了。?
??????接下來,我們就要看看Load怎么加載強命名程序集了,這個步驟稍微有些復雜。還是剛才的項目,找到MyAssembly.dll程序集所在的目錄,一般在bin\Debug目錄下?
(1)生成密鑰對文件?
sn –k MyAssemblyKey.keys?
你也可以自己隨便起一個密鑰對文件名?
(2)生成公鑰文件

sn –p??MyAssemblyKey.keys?MyAssemblyPublicKey.PublicKey?
注:查看公鑰命令:sn –tp MyAssemblyPublicKey.PublicKey?
??
(3)創建強命名程序集。?
很簡單,只需要在聲明命名空間的那句代碼上加上如下特性:?
[assembly:AssemblyKeyFileAttribute(@”D:\Test\MyAssemblyKey.keys”)]?
??
(4)???編譯項目?
(5)???將程序集添加到程序集全局緩存?
gacutil –i MyAssembly.dll?
這個時候,轉到加載程序集的項目中,將Load方法中的參數改為程序集名,Version=版本,culture=區域信息,PublicKeyToken=公鑰“,然后再去掉對程序集的引用,我們會發現,程序運行成功。表明Load到全局緩存區查找到了該程序集。?
???????使用Load方法加載程序集,特別是強命名程序集,能在程序集上應用安全和部署策略,推薦使用該方法動態加載程序集,至于LoadFrom和LoadWithPartialName,我們下次會做一些簡單的介紹,同時也希望有軟友能指出文中的錯誤或者遺漏的地方。下回見。

http://dev.firnow.com/course/1_web/webjs/200877/132108_2.html

轉載于:https://www.cnblogs.com/xuqiang/archive/2010/07/20/1953594.html

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

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

相關文章

山西萬榮盛裝迎新春 首屆群眾文化藝術節啟幕

山西萬榮盛裝迎新春,首屆群眾文化藝術節啟幕。 李繼旺 攝 山西萬榮盛裝迎新春,首屆群眾文化藝術節啟幕。 李繼旺 攝 中新網太原1月29日電 (任麗娜)璀璨閃耀的寶鼎廣場花燈展、激情活力的群眾文體賽事、精彩紛呈的紅火熱鬧、精品年貨展銷、李家大院游園會…

MySQL 隱式轉換 字符串和整型說明

MySQL 隱式轉換 字段類型定義 CREATE TABLE user (id int(10) NOT NULL AUTO_INCREMENT COMMENT 編號,/* ...... */name varchar(10) NOT NULL DEFAULT COMMENT 姓名,/* ...... */PRIMARY KEY (id),KEY idx_name (name,nickname),/* ...... */ ) ENGINEInnoDB DEFAULT CHARSE…

安裝vs2017出現閃退現象_Adobe Reader 閃退

在我們的日常辦公、學習中經常會涉及到 PDF 文件,免不了需要處理 PDF 文件如:PDF轉Word、PDF合并、導出成圖片、PDF解密、PDF轉PPT、PDF加水印、PDF簽名等等。PDF是與平臺無關的文件格式,無論在哪種打印機上都可保證精確的顏色和準確的打印效…

從Vue.js源碼中我學到的幾個實用函數

大家好,我是若川。歡迎加我微信 ruochuan12,長期交流學習。今天推薦Vuejs源碼中幾個實用的方法。如果想看Vuejs源碼,不知道如何下手,一般推薦配置Sourcemap,針對單個問題調試來看,如何調試Vuejs源碼&#x…

real類型_如何使用REAL方法對您的Web內容進行現實檢查

real類型Web內容審核模板 (Web content audit template) I recently completed a website audit project for a nonprofit organization through CatchAFire.org. As part of the website audit, I audited every key page’s content, looking for areas of opportunity.我最近…

青海行--(7月26日)翻越祁連山

嘉峪關是最值得一寫的,雖然也是著名的旅游城嘉峪關景點是國家AAAAA級景區,但與敦煌完全不一樣,沒有人山人海的游客,門票也不貴,才10&a…

TikTok真題第1天 | 666.路徑和IV、 207.課程表、210.課程表||

666.路徑和IV 題目鏈接:666.路徑和IV 解法: 參考這篇題解:【LeetCode - 666】路徑和 IV_力扣666路徑總和4-CSDN博客 關鍵點在于: (1)使用map來存node:key 為整數的前兩位,value…

導出Excel

2019獨角獸企業重金招聘Python工程師標準>>> 思路: 1, 引入Excel類庫; 2, 創建一個模板; 3, 將數據填充進去; 4, 生成文件; 下面是一個簡單的示例 $phpExcelObj new PHPExcel(); $titleMap self::TITLE_MAP; //設置表頭 $i 0; foreach ($titleMap as $key > $…

CentOS系統更換yum源(repomd.xml not found解決方案)

CentOS系統更換yum源 問題 當初瞎鼓搗服務器,更換yum源為aliyun的,奈何阿里的源最近全部打不開,導致yum安裝不了,一直報錯: http://mirrors.aliyun.com/centos/6/os/x86_64/repodata/repomd.xml: [Errno 14] PYCURL E…

在類中用class時數據是共有還是私有_jvm學習筆記之class文件的加載、初始化

編寫的java文件在要真正運行時,會首先被編譯成 “.class"結尾的二進制文件,然后被虛擬機加載。那么在虛擬機中一個class文件要成為java實例,需要經歷好幾個步驟:1、裝載:裝載階段由三個基本動作完成,要…

所有前端都要看的2D游戲化互動入門基礎知識

背景現在越來越多的公司和APP開始使用游戲化的方式去做產品了,所謂游戲化,是指在非游戲環境中將游戲的思維和游戲的機制進行整合運用,以引導用戶互動和使用的方法。支付寶里面的螞蟻莊園、螞蟻森林,通過游戲和公益的結合實現用戶的…

江蘇一動物園現“旋轉活馬” 園方:創意來自馬術訓練

中新網南通1月31日電 (記者唐娟)“旋轉馬設備采用同時容納六匹馬的遛馬器組裝而成,對馬匹沒有任何傷害,初衷是希望給小朋友一種全新體驗,這才有了這個創意項目。”1月31日,針對活馬版“旋轉木馬”引發的熱議,江蘇南通森…

Byte數組轉換成string 的方法積累

.net的加密算法,返回的都是byte[] 類型,在存貯起來讓人非常頭疼,最簡單的方法就是把byte[]轉換成string來存貯,當然如果數據量大的話,另當別論。 所以我就把byte[]轉換成string的方法做一個簡單的積累與分析。目前有3種…

加快信息化建設對地方發展的_加快設計師職業發展的9種方法

加快信息化建設對地方發展的重點 (Top highlight)Over the past few months, I have had an increase in conversations with design students from various institutions, as well as early, to senior-level designers, researchers, & product managers from various co…

Docker:Nginx-Redis-Mysql-PHP 部署

Docker:Nginx-Redis-Mysql-PHP 部署 網絡橋接 Docker容器之間默認網絡隔離,需要使用橋接網絡進行互通 創建網絡 docker network create net-local docker network ls NETWORK ID NAME DRIVER SCOPE da9c8fc3dc80 bridge bridge local 78641…

epoll監聽文件_介紹一下 Android Handler 中的 epoll 機制?

介紹一下 Android Handler 中的 epoll 機制?目錄:IO 多路復用select、poll、epoll 對比epoll APIepoll 使用示例Handler 中的 epoll 源碼分析IO 多路復用IO 多路復用是一種同步 IO 模型,實現一個線程可以監視多個文件句柄。一旦某個文件句柄就…

前端工程師的一大神器——puppeteer

大家好,我是若川。歡迎加我微信 ruochuan12,長期交流學習。今天推薦神器puppeteer,我猜有挺多人不知道。文章不長,看完有空也可以試玩。我18年也寫過一篇puppeteer爬取生成pdf的文章,時間真快。前端使用puppeteer 爬蟲…

selenium界面元素定位

一、 Selenium界面元素定位 本文元素定位以das2為例 #導入包 from selenium import webdriver #打開火狐驅動 driverwebdriver.Firefox() #訪問網址 driver.get("http://192.168.3.217:8080/das/seatlogin.jsp ") 進行web頁面自動化測試,對頁面上…

vue.js ui_UI / UX開發:考慮Vue.js

vue.js uiBecause sometimes we have to add logic to our concepts, and Vue makes it a whole lot easier.因為有時我們必須在概念中添加邏輯,而Vue使其變得更加容易。 FULL DISCLOSURE: THIS IS NOT A COMPLETE JAVASCRIPT OR VUE COURSE. There’s no way I co…

Silverlight學習筆記十七BingMap(三)之地圖的地區標識

如果我們需要在Bing Maps中加入一個小圖釘標記&#xff0c;該如何實現了&#xff1f; Bing Maps控件已經為我們提供了這個功能&#xff0c;在Microsoft.Maps.MapControl名稱空間下提供了實現圖釘應用的圖釘層Pushpin類用該類來實現普通標識 在Xaml中添加<map:Pushpin Locati…