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

首頁 > 編程 > C# > 正文

C# Resources資源詳解

2019-10-29 21:16:12
字體:
來源:轉載
供稿:網友

1. Resource Basics

(1) Manifest Resources(資源清單)

資源在編譯期間添加到程序集。如果要將資源嵌入到程序集,則必須將文件添加到項目中,文件會自動拷貝到項目文件夾的Resources文件夾中。如果要嵌入到程序集,還需選中文件,修改其屬性“生成操作”(Build Action)為“嵌入的資源”,默認為“內容”。

一旦設置為嵌入的資源,則它就會成為資源清單中程序集的一部分。每一程序集,無論是靜態的還是動態的,均包含描述該程序集中各元素彼此如何關聯的數據集合。程序集清單就包含這些程序集元數據。程序集清單包含指定該程序集的版本要求和安全標識所需的所有元數據,以及定義該程序集的范圍和解析對資源和類的引用所需的全部元數據。

(2) Naming Mainfest Resources

要查看一個已經正確嵌入到項目輸出程序集中的文件,可以利用SDK工具 ildasm.exe,它其實就是 MSIL 反匯編程序,它能夠在你程序集的Mainfest視圖里顯示所有的嵌入資源。

它在ildasm中顯示為 .mresource 入口,資源名稱顯示格式如下:

defaultNamespace.folderName.fileName

defaultNamespace 可以在項目的屬性頁面中“應用程序”Tab頁面中進行更改。

(3) Loading Mainfest Resources

也通過程序來枚舉清單,需要利用到 System.Reflection.Assembly 類的 GetMainifestResourceNames 方法。另外,還可以檢索特定類型的程序集,例如 Assembly 類還提供了 GetAssembly、GetCallingAssembly、GetEntryAssembly 和 GetExecutingAssembly 等。

// Get this type's assemblyAssembly asm =this.GetType().Assembly;// Enumerate the assembly's manifest resourcesforeach( string resourceName in asm.GetManifestResourceNames() ){MessageBox.Show(resourceName);}

Type 為 System.Reflection 功能的根,也是訪問元數據的主要方式。使用 Type 的成員獲取關于類型聲明的信息,如構造函數、方法、字段、屬性 (Property) 和類的事件,以及在其中部署該類的模塊和程序集。

表示某個類型是唯一的 Type 對象;即,兩個 Type 對象引用當且僅當它們表示相同的類型時,才引用相同的對象。這允許使用參考等式來比較 Type 對象。Type 類表示類型聲明:類類型、接口類型、數組類型、值類型、枚舉類型、類型參數、泛型類型定義,以及開放或封閉構造的泛型類型。Object.GetType 方法返回表示實例類型的 Type 對象。

如果知道資源的名稱,則可以通過 Assembly 類的方法 GetManifestResourceStream 方法加載指定的清單資源,資源名稱大小寫敏感,而且是全稱。例如:

// Get this type's assemblyAssembly asm =this.GetType().Assembly;// Get the stream that holds the resource// from the "ResourcesSample.Azul.jpg" resource// NOTE1: Make sure not to close this stream,//     or the Bitmap object will lose access to it// NOTE2: Also be very careful to match the case//     on the resource name itselfStream stream =asm.GetManifestResourceStream("ResourcesSample.Azul.jpg");// Load the bitmap from the streamthis.BackgroundImage =new Bitmap(stream);

(4) Mainfest Resource Namespaces

如果傳遞給 GetMainfestResourcesStream 方法 一個System.Type 對象,則它會用此類型的命名空間當作嵌入資源的前綴的一部分,如:

// Load the stream for resource "ResourcesSample.Azul.jpg"Stream stream = asm.GetManifestResourceStream(this.GetType(), "Azul.jpg");

Bitmap 類也可以直接裝載嵌入的資源,如:

// Load image from "ResourcesApp.Azul.jpg"this.BackgroundImage =new Bitmap(this.GetType(), "Azul.jpg");

2. Strongly Typed Resources

在清單資源中不包含類型信息,雖然文件帶有擴展名,但是類似Bitmap類是根據數據本身來判斷類型的。

(1) Application Resources(.resx) Files

資源文件(.resx)的主要作用就是記錄資源的相應類型信息,由于采用了.NET特定的XML方案(ResX)來保存資源類型信息。一個空的 .resx 文件也有42行內容,大多數都是方案信息。這個方案允許有許多條目信息,每個都包含name、value, comment, type 和 Multipurpose Internet Mail Extensions(MIME) type。雖然此文件是基于文本的,但是如果要編輯或者閱讀,最好還是通過VS2005的資源編輯器來完成。

.resx 格式中的名稱/值對在 XML 代碼中打包,它描述字符串或對象值。當字符串被添加到 .resx 文件中時,該字符串的名稱被嵌入在 <data> 標記中,并且值包括在 <value> 標記內,如以下示例所示。
當一個對象被插入到 .resx 文件中時,使用相同的 <data> 和 <value> 標記來描述該項,但 <data> 標記要包括類型或 MIME 類型說明符。類型說明符保留所保存對象的數據類型。如果對象由二進制數據組成,則 MIME 類型說明符保持所存儲的二進制信息的基類型 (Base64)。

(2) Managing Resources

資源編輯器支持六類資源:

a. 字符串 : 在帶有字符串資源的“名稱”、“值”和“注釋”列的設置網格中顯示字符串。
b. 圖像 : 顯示所有圖像文件(包括 .bmp、.jpg 和 .gif 格式)。這些文件在運行時作為 Bitmap 公開。此類別也包括作為 Metafile 公開的 Windows 圖元文件。
c. 圖標
d. 音頻 : 顯示聲音文件(包括 .wav、.wma 和 .mp3 文件)。這些文件作為字節數組公開。
e. 文件 : 顯示不適合以上類別的任何文件。此視圖中的項是作為 String 公開的文本文件,或是作為字節數組公開的二進制文件。
f. 其他   : 顯示用來添加其他支持字符串序列化的類型(例如,Font、Enum、Color 和 Point)的設置網格。此網格包含以下列:“名稱”、“類型”、“值”和“注釋”。

添加資源:

可以通過拖放、菜單選擇來添加資源,通過資源編輯器添加到.resx文件的所有資源文件都會放到項目文件夾下的Resources文件夾下,如果不存在則創建。如果將一個已經存在項目里的資源添加到.resx文件中,則這個資源不會被移動或拷貝到Resources文件夾下,因為資源編輯器是通過對文件的引用來管理資源文件,resx文件僅僅存放實際清單資源的類型信息。

刪除資源:

通過資源編輯器只能從.resx中移除或者剪切資源,而不能實際刪除,因為你只是對資源的元數據進行操作,而并非真正的資源文件(字符串除外,它只能被嵌入)。如果從項目中刪除資源文件,但是.resx中的相應元數據還在,這樣在編譯時就會出現編譯異常。

編輯資源: 可以通過資源編輯器直接打開相應的編輯程序;

(3) Resource Persistance

鏈接資源作為文件存儲在項目中;在編譯期間,從這些文件中取得資源數據,并將其放到應用程序的清單中。應用程序的資源文件 (.resx) 只存儲指向磁盤上的文件的相對路徑或鏈接。對于嵌入資源,資源數據直接以二進制數據的文本表示形式存儲在 .resx 文件中。在任何一種情況下,資源數據都將編譯到可執行文件中。

注意點:字符串資源總是嵌入的資源,無法更改;文件資源總是鏈接的資源,也無法更改。

如何在嵌入的資源和鏈接的資源之間進行選擇?
-----------------------------------------------------------------
在多數情況下,應該堅持默認的鏈接資源。但是,在有些情況下選擇嵌入的資源會更好。

嵌入的資源:
如果需要在多個項目之間共享應用程序資源 (.resx) 文件,則嵌入的資源是最佳選擇。例如,如果您有一個包含公司徽標、商標信息等類似內容的通用資源文件,則應使用嵌入的資源,這樣您只需復制 .resx 文件,而不用復制關聯的資源數據文件。不能直接編輯嵌入的資源。如果試圖編輯嵌入的資源,您將會接收到一條消息,提示您將該項轉換為鏈接的資源以便對其進行編輯;此轉換是可選的,但建議進行轉換。必須導出它們并在外部程序中進行修改,然后將其導回項目中。

鏈接的資源:
就易用性而言,鏈接的資源(默認值)是最好的選擇??梢栽陧椖績炔恐苯泳庉嬞Y源,并且可以根據需要輕松添加或移除資源。
-----------------------------------------------------------------

可以通過指定資源的Persistance屬性來決定。如果將屬性改為嵌入后,將資源文件刪除并不會有什么影響,此時如果再改回鏈接方式,則會在Resources目錄下重新創建此資源文件。

如果在資源編輯器下對資源進行管理,則會發現資源的BuildAction,即生成操作都會變為“無”。其實Persistance屬性僅僅在設計期間起作用,最終資源數據都將編譯到可執行文件中。

(4) Using Typed Resources

* 直接使用.resx文件

利用 ResXResourceReader 類來訪問.resx 文件;
此類可以枚舉 XML 資源 (.resx) 文件和流,并讀取順序資源名稱和值對,存在于命名空間 System.Resources。如果要提取特定條目,則需要先進行遍歷尋找。

using( ResXResourceReader reader = new ResXResourceReader(@"C:/MyResources.resx") ) { foreach( DictionaryEntry entry in reader ) {  string s =string.Format("{0} ({1})= '{2}'",    entry.Key, entry.Value.GetType(), entry.Value);   MessageBox.Show(s);  }}

* 使用編譯的.resx 資源

您可以采用三種不同的方式創建資源文件。如果您的資源將只包含字符串數據,則最簡單的方法是手動創建文本文件。如果您的資源將包含對象或字符串與對象的組合,則您必須創建 .resx 文件或 .resources 文件。只有.resources 文件才應嵌入在公共語言運行庫程序集和附屬程序集中。資源文件生成器 (Resgen.exe) 將文本 (.txt) 文件和基于 XML 的資源 (.resx) 文件轉換成 .resources 文件,

資源生成器 Resgen.exe :
將 .txt 文件轉換為 .resources 文件,方法是包裝由 ResourceWriter 類實現的方法。Resgen.exe 還包裝 ResourceReader,這使您可以使用該工具來將 .resources 文件轉換回 .txt 文件。

編譯項目后會將.resx數據嵌入為嵌套資源放在資源清單,例如項目缺省命名空間為A,rest文件為B.resx,則這個嵌套資源容器則為 A.B.resources,可以在ildasm中查看。對它的讀取利用 ResourceReader 類,也不支持隨機訪問。

using( ResourceReader reader = new ResourceReader("MyResources.resources") ) { foreach( DictionaryEntry entry in reader ) {  string s =string.Format("{0} ({1})= '{2}'",    entry.Key, entry.Value.GetType(), entry.Value);   MessageBox.Show(s);  }}

其實還可以直接通過對清單資源流的訪問來操作 .resources 文件。

Assembly asm = Assembly.GetExecutingAssembly();// Load embedded .resources fileusing(  Stream stream = asm.GetManifestResourceStream(  this.GetType(),  "MyResources.resources") ) { // Find resource in .resources stream using( ResourceReader reader =new ResourceReader(stream) ) {  foreach( DictionaryEntry entry in reader ) {   if( entry.Key.ToString() =="MyString" ) {    // Display string resource value     MessageBox.Show("MyString = "+ (string)entry.Value);    break;    }   }  }}

以上都需要進行多步操作而且不支持隨機訪問,但是.NET提供了 ResourceManager 類來支持對資源的隨機訪問。

(5) Resource Manager

ResourceManager 類可以查找區域性特定的資源,當本地化資源不存在時提供代用資源,并支持資源序列化,它其實也就是對ResourceReader的封裝。它由一個嵌入.resource文件初始化:

Assembly asm =this.GetType().Assembly;ResourceManager resman =new ResourceManager("ResourcesSample.MyResources", asm);

通過 ResourceManager 的方法,調用方可使用 GetObject 和 GetString 兩種方法訪問特定區域性的資源。

// Load ResourcesSample.MainForm.resources from MainForm.resxResourceManager resman =new ResourceManager(this.GetType());// Access the MyString string resource from the ResourceManager// (these two techniques are equivalent for strings)string s1 = (string)resman.GetObject("MyString");string s2 = resman.GetString("MyString");

(6) 強類型資源類

Resource Manager 提供了對資源的弱類型方法GetObject來返回資源,需要進行類型轉換。但是VS2005和一個自定義工具 ResXFileCodeGenerator 提供了對這個問題的解決辦法。當一個 .resx 文件被保存時,VS2005會應用自定義工具將其產生一個相應的 .Designer.cs 文件,此文件提供了一個名字和 .resx 文件相同的類,這個類所處的命名空間為 defaultNamespace.projectPath。

 

namespace ResourcesSample {  ///<summary>  ///    A strongly typed resource class, for looking up localized  ///    strings, etc.  ///</summary>  // This class was autogenerated by the StronglyTypedResourceBuilder  // class via a tool like ResGen or Visual Studio.  // To add or remove a member, edit your .resx file and then rerun ResGen  // with the /str option, or rebuild your VS project.  internalclass MyResources {   static global::System.Resources.ResourceManager resourceMan;   static global::System.Globalization.CultureInfo resourceCulture;   internal MyResources() {}   ///<summary>   ///  Returns the cached ResourceManager instance used by this   ///  class.   ///</summary>   internalstatic global::    System.Resources.ResourceManager ResourceManager {    get {     if( (resourceMan ==null) ) {      global::System.Resources.ResourceManager temp =       new global::System.Resources.ResourceManager(        "ResourcesSample.MyResources",        typeof(MyResources).Assembly);      resourceMan = temp;     }     return resourceMan;    }   }   ///<summary>   ///  Overrides the current thread's CurrentUICulture property for   ///  all resource lookups using this strongly typed resource class.   ///</summary>   internalstatic global::System.Globalization.CultureInfo Culture {    get { return resourceCulture; }    set { resourceCulture = value; }   }  }}

由以上可以看出 MyResource 類型的兩個特征:

a. 它通過一個ResourceManager類型的屬性提供了對ResourceManager的靜態訪問,就沒必要寫之前的創建邏輯了; b. 通過一個Culture屬性提供了CultureInfo對象實現對本地化信息的靜態訪問;

提供的每個資源都是強類型靜態只讀屬性。在內部實現中,每個屬性都由設計器生成的資源類利用托管的ResourceMananger對象產生的;

// Access strongly typed resources from MyResources.resxstring myString = MyResources.MyString;Icon myIcon = MyResources.MyIcon;

(7) Designer Resources

VS2005提供了整個項目的資源管理。由于Resources.resx 文件是從項目的屬性頁來進行管理的,所以 VS2005將它存放到項目的Properties文件夾中。當在項目中添加.resx文件時,ResXFileCodeGenerator工具會自動生成Resources.Designer.cs:

namespace ResourcesSample.Properties {
   ...
   internal class Resources {
   ...

則可以如下來訪問資源:MessageBox.Show(Properties.Resources.MyString);

項目會自動生成一個跟窗體關聯的.resx 文件,保存類似 BackgroundImage 和 Icon 等資源信息。屬性窗口可以打開選擇資源編輯器,允許選擇適當的圖片資源。它提供了兩種導入和保存資源的方式:作為本地資源;作為項目資源文件。對于窗體,本地資源被嵌入到窗體設計器自動創建的.resx文件中并和窗體關聯,如果選擇本地資源,則可以直接將圖片導入到窗體的資源文件中。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产精品成人va在线观看| 黄色91在线观看| 91在线精品视频| 欧美亚州一区二区三区| 亚洲综合在线播放| 日韩欧美亚洲成人| 色午夜这里只有精品| 欧美成人三级视频网站| 久久久成人的性感天堂| 国内久久久精品| 欧美日韩成人精品| 隔壁老王国产在线精品| 国产美女91呻吟求| 亚洲福利影片在线| 欧美日韩中文在线| 国产精品三级美女白浆呻吟| 国产精品精品久久久| 欧美国产日韩一区二区| 国产z一区二区三区| 日韩精品视频在线播放| 久久在线免费视频| 欧美一级黑人aaaaaaa做受| 成人免费淫片aa视频免费| 日韩欧美中文第一页| 亚洲精品欧美一区二区三区| 91色视频在线导航| 91视频88av| 亚洲丝袜在线视频| 日韩免费在线看| 91精品视频观看| 成人激情综合网| 亚洲成年人在线| 亚洲一区美女视频在线观看免费| 国产精品美女www| 亚洲国产精品久久久久久| 久久久久久国产精品久久| 国产精品久久久久久久久久99| 亚洲自拍小视频免费观看| 日韩大片在线观看视频| 亚洲va男人天堂| 国产精品中文字幕在线观看| 亚洲精品自拍偷拍| 亚洲免费小视频| 欧美成年人视频网站欧美| 日韩精品视频观看| 欧美性视频网站| 色悠久久久久综合先锋影音下载| 成人日韩av在线| 欧美综合一区第一页| 国产精品久久久久一区二区| 亚洲淫片在线视频| 欧美日韩成人在线视频| 色综合天天综合网国产成人网| 久久精品国产一区二区三区| 国产不卡在线观看| 亚洲国产精品va在线看黑人| 亚洲第一av网| 欧美亚洲伦理www| 国产最新精品视频| 在线观看中文字幕亚洲| 久热精品视频在线观看| 久久久久久久久久久免费| 日韩在线免费视频| 国产精品青青在线观看爽香蕉| 这里只有精品在线观看| 久久精品视频在线| 狠狠躁夜夜躁人人爽天天天天97| 成人精品福利视频| 欧美激情乱人伦| 国产成人精品免费视频| 欧美日本啪啪无遮挡网站| 国产精品久久电影观看| 国产在线精品自拍| 亚洲精品国产免费| 亚洲高清免费观看高清完整版| 国产精品亚洲综合天堂夜夜| 97视频在线观看播放| 一区二区在线免费视频| 日韩精品在线影院| 久久精品欧美视频| 国产色婷婷国产综合在线理论片a| 欧美激情按摩在线| 日韩视频在线免费| 国产亚洲精品高潮| 国产v综合ⅴ日韩v欧美大片| 亚洲国产高清自拍| 欧美亚洲国产日本| 91精品久久久久久久久久| 日日骚久久av| 午夜剧场成人观在线视频免费观看| 欧洲永久精品大片ww免费漫画| 欧美成人免费播放| 亚洲自拍在线观看| 91精品国产色综合久久不卡98| 成人免费观看网址| 久久久久国产视频| 欧美国产精品va在线观看| 日本伊人精品一区二区三区介绍| 精品久久久久久久久久久| 日韩在线播放一区| 一本色道久久综合狠狠躁篇怎么玩| 亚洲激情视频在线播放| 欧美大尺度激情区在线播放| 国产狼人综合免费视频| 在线电影欧美日韩一区二区私密| 国产美女被下药99| 国产成人一区二| 亚洲精美色品网站| 97久久国产精品| 欧美人与性动交a欧美精品| 91久久在线观看| 91国产高清在线| 国产精品偷伦一区二区| 国产精品嫩草影院久久久| 欧美一性一乱一交一视频| 久久国产视频网站| 国产精品免费一区二区三区都可以| 中文字幕久久精品| 91中文精品字幕在线视频| 97超级碰在线看视频免费在线看| 亚洲自拍偷拍网址| 欧美视频在线观看 亚洲欧| 亚洲精品电影网在线观看| 北条麻妃久久精品| 日韩精品欧美激情| 欧美日韩一区二区免费在线观看| 久久中文久久字幕| 国产美女精品视频| 国产中文日韩欧美| 亚洲欧美色婷婷| 日韩欧美一区二区在线| 日韩电影大全免费观看2023年上| 亚洲一级黄色片| 欧美另类69精品久久久久9999| 亚洲精品456在线播放狼人| 8090理伦午夜在线电影| 日韩免费在线免费观看| 国产精品一区二区久久精品| 亚洲国产精品嫩草影院久久| 在线色欧美三级视频| 久久久久久久电影一区| 国产精品日日摸夜夜添夜夜av| 尤物99国产成人精品视频| 久久久免费在线观看| 日产精品久久久一区二区福利| 色婷婷av一区二区三区久久| 午夜美女久久久久爽久久| 日韩欧美中文第一页| 精品动漫一区二区| 日韩视频精品在线| 国产日韩欧美在线播放| 国产精品高潮粉嫩av| 亚洲免费视频观看| 欧美视频二区36p| 中文字幕在线看视频国产欧美| 美女福利精品视频| 国产免费亚洲高清| 欧美成人三级视频网站| 久久躁狠狠躁夜夜爽| 中文在线资源观看视频网站免费不卡| 81精品国产乱码久久久久久| 欧美一级淫片丝袜脚交| 欧美性猛交xxxx免费看久久久| 国产午夜精品免费一区二区三区|