ASP.NET文件類型與資源文件簡介
.NET文件類型解析
*.resx是資源文件。每個(gè)頁面都有一個(gè)資源文件相對應(yīng)。
global.asax是global.asa的.net版
global.asax.vb是global.asax的后臺(tái)文件。
*.ascx是一個(gè)用戶自定義控件。
*.ascx.vb是自定義控件的代碼文件,C#的是*.ascx.cs
*.ascx.resx是自定義控件的資源文件。
*.aspx.vb是*.aspx頁面的后臺(tái)代碼。
web.config是整個(gè)Web Application的配置文件。
*.vbproj是VB.NET的工程文件。
*.vsdisco是Web Service的文件。
*.vbproj.webinfo是VB.NET工程文件的Web Application文件。
*.sln是VS.NET的解決方案文件。
其中g(shù)lobal.asax,global.asax.vb,web.config,*.vbproj,*.vsdisco,*.vbproj.webinfo,*.sln都是在建立一個(gè)VB.NET的Web Application工程的時(shí)候自動(dòng)產(chǎn)生的。
ASP.NET的頁面文件是*.aspx,每個(gè)頁面對應(yīng)一個(gè)*.resx資源文件和一個(gè)*.aspx.vb的代碼文件
.NET文件類型:什么是資源文件
在 .NET 中準(zhǔn)備 World-Ready 程序時(shí)需要三步,Globalization,Localizability 和 Localization。在這第三步的 Localization 中就是使用資源文件最常見的地方。(本文不討論 World-Ready 程序,或許以后在另一篇文章中)因?yàn)槌绦虻倪壿嫿缑嫘枰c資源界面隔離,而資源界面就是我們所說的資源文件。顧名思義,一個(gè)資源文件中當(dāng)然全是資源,不過,什么是資源?這里所謂的資源就是程序中可利用的數(shù)據(jù),譬如:字符串、圖片和任何二進(jìn)制數(shù)據(jù),包括任何類型的文件。注意一個(gè)資源文件可以有多種語言版本,舉例,一個(gè) Strings.resources 文件可以有英語版、簡體中文版、繁體中文版等。 ResourceManager 可以自動(dòng)根據(jù)文件名來確認(rèn)調(diào)用哪個(gè)版本。不同的版本只要在文件名中添入?yún)^(qū)域語言就可以了。比如,我們的 Strings.resources 是默認(rèn)版,英語版的可以是 Strings.en-US.resources(美國英文),簡體中文的可以是 Strings.zh-CHS.resources(簡體中文),而繁體中文的就可以是 Strings.zh-CHT.resources(繁體中文)。所謂的默認(rèn)版就是當(dāng)找不到適當(dāng)?shù)馁Y源版本時(shí)用的資源,一般都是英文。默認(rèn)文件應(yīng)當(dāng)被嵌入到主 Assembly 中,這樣就不會(huì)發(fā)生找不到資源的錯(cuò)誤。在 VS.NET 中將一個(gè)文件的屬性設(shè)為 Embedded Resource 可以使資源被嵌入到主 Assembly 中。
.NET文件類型:資源文件類型
System.Resources 名字空間支持三種資源文件:
.txt 文件,只能有字符串資源。因?yàn)椴荒鼙磺度氲?Assembly 中,所以很容易暴露,被客戶修改。***缺點(diǎn)是僅支持字符串資源,所以不推薦使用。
.resx 文件,由 XML 組成,可以加入任何資源,包括二進(jìn)制。同樣不能被嵌入到 Assembly 中。在 System.Resources 名字空間中有專用讀寫的類。VS.NET 創(chuàng)建這種文件然后將其轉(zhuǎn)成 .resources 文件并根據(jù)設(shè)置將其嵌入到 Assembly 中。
.resources 文件,PE 格式,可以加入任何資源。唯一可以被嵌入到 Assembly 的文件,在 System.Resources 名字空間中有專用讀寫的類。
.NET文件類型:調(diào)用資源文件的幾種方法
ResourceManager 可以根據(jù)不同的 UICulture 設(shè)置返回不同的本地資源(這與 World-Ready 程序有關(guān),在此不討論),我們只需知道調(diào)用資源用到它就可以了。接下來讓我們看看如何調(diào)用每一種:
.txt 文件:
不可以直接調(diào)用,得先將其轉(zhuǎn)換成 .resources 文件才能使用。(關(guān)于如何轉(zhuǎn)換請看"推薦工具")
.resx 文件:
可以用 ResXResourceReader 來做讀取,但是這種方法不直觀,不推薦直接調(diào)用 .resx 文件。正確的方法是將其轉(zhuǎn)換成 .resources 文件,然后用 ResourceManager 作讀取工作。注意如果是在 VS.NET 中添加的 .resx 文件,那么它們自動(dòng)被設(shè)為 Embedded Resource,轉(zhuǎn)成 .resources 文件后被嵌入到 Assembly 中。
.resources 文件:
分成兩種情況:
被嵌入或編譯成 Satellite Assembly:
用 ResourceManager 的各種 constructor 來獲得在 Assembly 中的資源。
單獨(dú)文件,沒被編譯或嵌入到 Assembly 中:
可以用 ResourceManager.CreateFileBasedResourceManager 來獲得資源集(ResourceSet),就是所有的資源。
特殊情況:
還有一種特殊情況,那就是當(dāng)你直接嵌入一資源時(shí),也就是說,不通過一個(gè)資源文件而直接將一資源嵌入到 Assembly 中。這可以在 VS.NET 中通過設(shè)置一文件的 Build 屬性為 Embedded Resource 實(shí)現(xiàn)。在這種情況下 ResourceManager 就沒有用了,因?yàn)樗荒塬@取 .resources 資源文件(在或不在 Assembly 中)。那么如何調(diào)用這類的資源呢?不難,我們需要利用一些 Reflection 中的特征。別怕,不是讓你再學(xué) Reflection,其實(shí)我們只要了解一些 System.Reflection.Assembly 這個(gè)類中的一些函數(shù)就可以了。有三個(gè)相關(guān)函數(shù),不過我們只需要 Assembly.GetManifestResourceStream 這個(gè)函數(shù)。這個(gè)函數(shù)將一嵌入到 Assembly 中的資源以 stream 的方式返回,而我們可以將這個(gè) stream 轉(zhuǎn)成在 .NET 中可用的對象。比如,如果嵌入資源是一圖片,那么我們可以利用 New Bitmap(Stream) 這個(gè) Bitmap 的 constructor 獲得這個(gè)圖片資源的 Bitmap 對象。
注:在這里僅介紹怎樣獲得不同的資源的方法,關(guān)于怎樣用各個(gè)類與函數(shù)請參看有關(guān)文檔。
如何準(zhǔn)確的定義資源文件的邏輯位置
我想這是許多人最關(guān)注的一段了!在這里作者將解說如何正確的填寫 ResouceManager(String, Assembly) 這個(gè) constructor,還有如何正確的填寫 Assembly.GetManifestResourceStream(String),因?yàn)樗鼈儍蓚€(gè)的原理是相同的??催^了上面的描述,到了這里就簡單多了。這里主要討論的是怎么填寫那個(gè) String。這個(gè) String 就是資源的完整名,一個(gè)完整名由它的名字空間和文件名前部分(BaseName)組成。例如,如果默認(rèn)名字空間(root namespace)是 DefaultNamespace,資源文件的名字是 Strings.en-US.resources,那么它的完整名就是 DefaultNamespace.Strings。這個(gè)很簡單,不過怎樣確定名字空間呢?這就有些奇怪了,因?yàn)?C# 的編譯器與 VB.NET 的編譯器有些不同。作者在這里分別給出兩個(gè)編譯器怎樣給嵌入資源自動(dòng)添加命名空間:
C#
它自動(dòng)添加 default namespace(與 root namespace 相同),但也添加子文件夾的名字。例如,在 Subfolder 子文件夾下放的資源文件 Strings.en-US.resources,它的完整名是 default namespace + subfolder + base name = DefaultNamespace.Subfolder.Strings
VB.NET
在 VB.NET 中就很簡單了,它自動(dòng)給嵌入資源添加 root namespace。不管你在哪個(gè)子文件夾中放置資源文件,資源文件的完整名永遠(yuǎn)是 root namespace + base name。
根據(jù)上面的描述,如果我們使用 C#,用 VS.NET 在 NewFolder 這個(gè)子文件夾中添加了一個(gè)叫 Images.resources 的資源文件,那么我們應(yīng)該用以下代碼獲取這些資源,假設(shè) default namespace 是 MyDefault:
ResourceManager res = new ResourceManager("MyDefault.NewFolder.Images", this.GetType().Assembly);
但如果我們用 VB.NET 的話,就應(yīng)該這樣:
Dim res As New ResourceManager("MyDefault.Images", Me.GetType().Assembly)
推薦工具
resgen.exe:SDK 中的工具,專門用來做資源文件類型之間的轉(zhuǎn)換。支持 .txt <-> .resx <-> .resources 之間的轉(zhuǎn)換。
Resourcer:專門用來創(chuàng)建資源文件,簡單易用,支持 .resx 與 .resources 文件格式。
.NET Reflector:用來瀏覽 Assembly。如果你不確定一個(gè)資源文件的完整名時(shí)可以用這個(gè)工具在 Assembly 中查看。
【編輯推薦】