亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

在dotnet中如何使用資源

2024-07-21 02:23:42
字體:
來源:轉載
供稿:網友

商業源碼熱門下載www.html.org.cn

如何使用資源文件

--------------------------------------------------------------------------------

摘要
.net 中有一套非常完善的地方化系統被定義在 system.resources 名字空間中。不過大多數人都被 missingmanifestresourceexception 這個錯誤困惑著。本文就是要讓大家了解什么是資源文件,它有什么用處以及如何正確的調用從而避免一些"奇怪"的錯誤,包括 missingmanifestresourceexception 這個常見錯誤。

--------------------------------------------------------------------------------

目錄
本文來源以及最終目的
什么是資源文件
資源文件類型
調用資源文件的幾種方法
如何準確的定義資源文件的邏輯位置
推薦工具
總結
參考信息
關于作者

--------------------------------------------------------------------------------

本文來源以及最終目的
最近作者在新聞組中看到許多有關資源文件的問題,而大多數人都有 missingmanifestresourceexception 這個非常時髦的錯誤。所以作者考慮了一下,決定不想再讓更多的人把時間都浪費在這個問題上了。這就是這篇文章的誕生原因。而最終目的除了讓這個問題在新聞組上消失之外還要讓大家在 10 分鐘內徹底掌握資源的調用,從而成為真正的資源高手?。海?br>
--------------------------------------------------------------------------------

什么是資源文件
在 .net 中準備 world-ready 程序時需要三步,globalization,localizability 和 localization。在這第三步的 localization 中就是使用資源文件最常見的地方。(本文不討論 world-ready 程序,或許以后在另一篇文章中)因為程序的邏輯界面需要與資源界面隔離,而資源界面就是我們所說的資源文件。顧名思義,一個資源文件中當然全是資源,不過,什么是資源?這里所謂的資源就是程序中可利用的數據,譬如:字符串、圖片和任何二進制數據,包括任何類型的文件。注意一個資源文件可以有多種語言版本,舉例,一個 strings.resources 文件可以有英語版、簡體中文版、繁體中文版等。 resourcemanager 可以自動根據文件名來確認調用哪個版本。不同的版本只要在文件名中添入區域語言就可以了。比如,我們的 strings.resources 是默認版,英語版的可以是 strings.en-us.resources(美國英文),簡體中文的可以是 strings.zh-chs.resources(簡體中文),而繁體中文的就可以是 strings.zh-cht.resources(繁體中文)。所謂的默認版就是當找不到適當的資源版本時用的資源,一般都是英文。默認文件應當被嵌入到主 assembly 中,這樣就不會發生找不到資源的錯誤。在 vs.net 中將一個文件的屬性設為 embedded resource 可以使資源被嵌入到主 assembly 中。

--------------------------------------------------------------------------------

資源文件類型
system.resources 名字空間支持三種資源文件:
.txt 文件,只能有字符串資源。因為不能被嵌入到 assembly 中,所以很容易暴露,被客戶修改。最大缺點是僅支持字符串資源,所以不推薦使用。
.resx 文件,由 xml 組成,可以加入任何資源,包括二進制。同樣不能被嵌入到 assembly 中。在 system.resources 名字空間中有專用讀寫的類。vs.net 創建這種文件然后將其轉成 .resources 文件并根據設置將其嵌入到 assembly 中。
.resources 文件,pe 格式,可以加入任何資源。唯一可以被嵌入到 assembly 的文件,在 system.resources 名字空間中有專用讀寫的類。

--------------------------------------------------------------------------------

調用資源文件的幾種方法
resourcemanager 可以根據不同的 uiculture 設置返回不同的本地資源(這與 world-ready 程序有關,在此不討論),我們只需知道調用資源用到它就可以了。接下來讓我們看看如何調用每一種:
.txt 文件:
不可以直接調用,得先將其轉換成 .resources 文件才能使用。(關于如何轉換請看"推薦工具")
.resx 文件:
可以用 resxresourcereader 來做讀取,但是這種方法不直觀,不推薦直接調用 .resx 文件。正確的方法是將其轉換成 .resources 文件,然后用 resourcemanager 作讀取工作。注意如果是在 vs.net 中添加的 .resx 文件,那么它們自動被設為 embedded resource,轉成 .resources 文件后被嵌入到 assembly 中。
.resources 文件:
分成兩種情況:
被嵌入或編譯成 satellite assembly:
用 resourcemanager 的各種 constructor 來獲得在 assembly 中的資源。
單獨文件,沒被編譯或嵌入到 assembly 中:
可以用 resourcemanager.createfilebasedresourcemanager 來獲得資源集(resourceset),就是所有的資源。
特殊情況:
還有一種特殊情況,那就是當你直接嵌入一資源時,也就是說,不通過一個資源文件而直接將一資源嵌入到 assembly 中。這可以在 vs.net 中通過設置一文件的 build 屬性為 embedded resource 實現。在這種情況下 resourcemanager 就沒有用了,因為它只能獲取 .resources 資源文件(在或不在 assembly 中)。那么如何調用這類的資源呢?不難,我們需要利用一些 reflection 中的特征。別怕,不是讓你再學 reflection,其實我們只要了解一些 system.reflection.assembly 這個類中的一些函數就可以了。有三個相關函數,不過我們只需要 assembly.getmanifestresourcestream 這個函數。這個函數將一嵌入到 assembly 中的資源以 stream 的方式返回,而我們可以將這個 stream 轉成在 .net 中可用的對象。比如,如果嵌入資源是一圖片,那么我們可以利用 new bitmap(stream) 這個 bitmap 的 constructor 獲得這個圖片資源的 bitmap 對象。
注:在這里僅介紹怎樣獲得不同的資源的方法,關于怎樣用各個類與函數請參看有關文檔。

--------------------------------------------------------------------------------

如何準確的定義資源文件的邏輯位置
我想這是許多人最關注的一段了!在這里作者將解說如何正確的填寫 resoucemanager(string, assembly) 這個 constructor,還有如何正確的填寫 assembly.getmanifestresourcestream(string),因為它們兩個的原理是相同的??催^了上面的描述,到了這里就簡單多了。這里主要討論的是怎么填寫那個 string。這個 string 就是資源的完整名,一個完整名由它的名字空間和文件名前部分(basename)組成。例如,如果默認名字空間(root namespace)是 defaultnamespace,資源文件的名字是 strings.en-us.resources,那么它的完整名就是 defaultnamespace.strings。這個很簡單,不過怎樣確定名字空間呢?這就有些奇怪了,因為 c# 的編譯器與 vb.net 的編譯器有些不同。作者在這里分別給出兩個編譯器怎樣給嵌入資源自動添加命名空間:
c#
它自動添加 default namespace(與 root namespace 相同),但也添加子文件夾的名字。例如,在 subfolder 子文件夾下放的資源文件 strings.en-us.resources,它的完整名是 default namespace + subfolder + base name = defaultnamespace.subfolder.strings
vb.net
在 vb.net 中就很簡單了,它自動給嵌入資源添加 root namespace。不管你在哪個子文件夾中放置資源文件,資源文件的完整名永遠是 root namespace + base name。
根據上面的描述,如果我們使用 c#,用 vs.net 在 newfolder 這個子文件夾中添加了一個叫 images.resources 的資源文件,那么我們應該用以下代碼獲取這些資源,假設 default namespace 是 mydefault:
resourcemanager res = new resourcemanager("mydefault.newfolder.images", this.gettype().assembly);
但如果我們用 vb.net 的話,就應該這樣:
dim res as new resourcemanager("mydefault.images", me.gettype().assembly)

--------------------------------------------------------------------------------

推薦工具
resgen.exe:sdk 中的工具,專門用來做資源文件類型之間的轉換。支持 .txt <-> .resx <-> .resources 之間的轉換。
resourcer:專門用來創建資源文件,簡單易用,支持 .resx 與 .resources 文件格式。(http://www.aisto.com/roeder/dotnet)
.net reflector:用來瀏覽 assembly。如果你不確定一個資源文件的完整名時可以用這個工具在 assembly 中查看。(http://www.aisto.com/roeder/dotnet)

--------------------------------------------------------------------------------

總結
本文中談及了以下內容:
什么是資源
什么是資源文件
.net 中有哪幾類資源文件
如何定義資源文件的邏輯位置
調用資源文件的幾種方法
本文通過正確定位資源文件而解決了那個非常時髦的 missingmanifestresourceexception。本文給了您一個很豐富資源調用經驗。想讓您完全了解有關資源文件的任何可能問題,當然也會有漏洞。如果有的話希望大家諒解!

--------------------------------------------------------------------------------

參考信息
以下是一些文檔的鏈接,如果您的幫助是中文的話請在 msdnvs 后添加".2052":
resource file generator (resgen.exe)
ms-help://ms.vscc/ms.msdnvs/cptools/html/cpgrfresourcefilegeneratorutilityresgenexe.htm
resources in applications
ms-help://ms.vscc/ms.msdnvs/cpguide/html/cpconcreatingusingresources.htm
resource fallback process
ms-help://ms.vscc/ms.msdnvs/cpguide/html/cpconpackagingdeployingresources.htm #cpconpackagingdeployingresourcesanchor1

--------------------------------------------------------------------------------

關于作者
作者:袁偉(kefroth)
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
最好看的2019的中文字幕视频| 91久久久在线| 国产视频亚洲精品| 欧美韩国理论所午夜片917电影| 成人性生交xxxxx网站| 国产精品视频一区国模私拍| 日韩中文字幕免费| 欧美一区二区三区精品电影| 7777精品视频| 国产日本欧美一区二区三区在线| 欧美华人在线视频| 日韩高清中文字幕| 欧美日韩一区二区免费在线观看| 欧美精品18videos性欧| 91在线观看免费高清完整版在线观看| www国产亚洲精品久久网站| 国产日韩欧美在线视频观看| 亚洲图片在区色| 日本亚洲欧美成人| 日本高清不卡在线| 全球成人中文在线| 国产成人综合精品在线| 91超碰caoporn97人人| 亚洲国产欧美在线成人app| 日韩精品视频在线观看网址| 亚洲福利视频二区| 久久久精品在线观看| 欧美亚洲在线播放| 亚洲欧美制服中文字幕| 日韩成人高清在线| 国产日韩欧美夫妻视频在线观看| 国产精品欧美激情在线播放| 欧美在线一区二区视频| 伊人伊成久久人综合网小说| 国产欧美va欧美va香蕉在线| 亚洲欧美日韩一区在线| 国产日韩欧美另类| 91精品国产综合久久香蕉| 欧美在线视频一区二区| 久久久之久亚州精品露出| 日韩国产一区三区| 亚洲自拍高清视频网站| 欧美激情一区二区三区在线视频观看| 中文字幕亚洲情99在线| 亚洲精品理论电影| 黄色一区二区在线| 91高清免费视频| 欧洲精品毛片网站| www.xxxx精品| 欧美性xxxx极品hd欧美风情| 国产精品成人国产乱一区| 亚洲国产精品国自产拍av秋霞| 国产欧美日韩专区发布| 国产精品成人av性教育| 成人免费视频网址| 性亚洲最疯狂xxxx高清| 国产精品亚洲精品| 精品毛片网大全| 欧美性猛交xxxx黑人猛交| 欧美裸体xxxx极品少妇软件| 亚洲一区二区三区在线视频| 97国产在线视频| 久久久久久免费精品| 久久综合伊人77777尤物| 欧美电影免费观看电视剧大全| 欧美日韩免费看| 超碰精品一区二区三区乱码| 日韩久久精品电影| 91精品成人久久| 欧美日韩高清在线观看| 欧美在线精品免播放器视频| 亚洲人a成www在线影院| 精品亚洲夜色av98在线观看| 日韩电影免费观看中文字幕| 日韩在线视频观看正片免费网站| 国产精品专区一| 亚洲欧洲成视频免费观看| 国产欧美精品一区二区| 日韩有码在线观看| 久久久亚洲天堂| 狠狠躁夜夜躁人人躁婷婷91| 尤物精品国产第一福利三区| 亚洲区在线播放| 色香阁99久久精品久久久| 成人乱人伦精品视频在线观看| 亚洲精品中文字| 日韩av电影免费观看高清| 欧美日韩中文字幕日韩欧美| 色天天综合狠狠色| 日韩国产高清视频在线| 久久久成人的性感天堂| 日本国产欧美一区二区三区| 亚洲精品国产精品久久清纯直播| 欧美亚洲国产日韩2020| 亚洲电影第1页| 91中文字幕一区| 95av在线视频| 欧美洲成人男女午夜视频| 在线观看欧美视频| 国产精品亚洲第一区| 国产成人精品免高潮在线观看| 久久综合色影院| 国产精品入口福利| 日韩精品极品毛片系列视频| 不卡av电影院| 国产一区二区三区视频免费| 永久555www成人免费| 国产精品网红直播| 欧美成人激情视频| 久久久久久伊人| 亚洲日韩第一页| 国产精品久久一区主播| 亚洲精品视频网上网址在线观看| 欧美人与性动交a欧美精品| 91成人国产在线观看| 久久亚洲国产精品| 国产在线精品自拍| 久久久久久久一区二区| 国产丝袜一区二区三区免费视频| 色偷偷偷综合中文字幕;dd| 国产一区二区三区中文| 精品中文字幕乱| 精品无人区太爽高潮在线播放| 国产成人极品视频| 亚洲最大福利视频| 日本在线精品视频| 青青久久av北条麻妃黑人| 久久理论片午夜琪琪电影网| 97在线观看视频| 久久久久在线观看| 亚洲视频专区在线| 国产亚洲精品日韩| 亚洲第一色在线| 69视频在线免费观看| 日韩av不卡在线| 国产有码在线一区二区视频| 国产一区在线播放| 视频在线观看一区二区| 日韩av在线资源| 视频在线一区二区| xvideos成人免费中文版| 国产91对白在线播放| 亚洲视频精品在线| 欧美激情精品久久久久久| 草民午夜欧美限制a级福利片| 亚洲欧美福利视频| 精品久久久久久亚洲精品| 日韩免费在线电影| 亚洲精品av在线| 亚洲国产精品高清久久久| 欧美中在线观看| 黑人精品xxx一区| 8090理伦午夜在线电影| 久久精品国产亚洲一区二区| 成人久久久久爱| 久久影视三级福利片| 亚洲成人三级在线| 欧美成人精品三级在线观看| 亚洲女人天堂成人av在线| 亚洲精品国精品久久99热| 丝袜美腿精品国产二区| 久久精品一区中文字幕| 欧美激情精品久久久久久| 亚洲免费视频一区二区|