欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# Resources資源詳解

 更新時(shí)間:2017年01月03日 09:32:45   作者:路燈下的詩人  
這篇文章主要為大家詳細(xì)介紹了C# Resources資源,包括Resource Basics、Strongly Typed Resources等,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

1. Resource Basics

(1) Manifest Resources(資源清單)

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

一旦設(shè)置為嵌入的資源,則它就會(huì)成為資源清單中程序集的一部分。每一程序集,無論是靜態(tài)的還是動(dòng)態(tài)的,均包含描述該程序集中各元素彼此如何關(guān)聯(lián)的數(shù)據(jù)集合。程序集清單就包含這些程序集元數(shù)據(jù)。程序集清單包含指定該程序集的版本要求和安全標(biāo)識(shí)所需的所有元數(shù)據(jù),以及定義該程序集的范圍和解析對(duì)資源和類的引用所需的全部元數(shù)據(jù)。

(2) Naming Mainfest Resources

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

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

defaultNamespace.folderName.fileName

defaultNamespace 可以在項(xiàng)目的屬性頁面中“應(yīng)用程序”Tab頁面中進(jìn)行更改。

(3) Loading Mainfest Resources

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

// Get this type's assembly
Assembly asm =this.GetType().Assembly;

// Enumerate the assembly's manifest resources
foreach( string resourceName in asm.GetManifestResourceNames() ){
MessageBox.Show(resourceName);
}

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

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

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

// Get this type's assembly
Assembly 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 itself
Stream stream =
asm.GetManifestResourceStream("ResourcesSample.Azul.jpg");
// Load the bitmap from the stream
this.BackgroundImage =new Bitmap(stream);

(4) Mainfest Resource Namespaces

如果傳遞給 GetMainfestResourcesStream 方法 一個(gè)System.Type 對(duì)象,則它會(huì)用此類型的命名空間當(dāng)作嵌入資源的前綴的一部分,如:

// 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

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

(1) Application Resources(.resx) Files

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

.resx 格式中的名稱/值對(duì)在 XML 代碼中打包,它描述字符串或?qū)ο笾怠.?dāng)字符串被添加到 .resx 文件中時(shí),該字符串的名稱被嵌入在 <data> 標(biāo)記中,并且值包括在 <value> 標(biāo)記內(nèi),如以下示例所示。
當(dāng)一個(gè)對(duì)象被插入到 .resx 文件中時(shí),使用相同的 <data> 和 <value> 標(biāo)記來描述該項(xiàng),但 <data> 標(biāo)記要包括類型或 MIME 類型說明符。類型說明符保留所保存對(duì)象的數(shù)據(jù)類型。如果對(duì)象由二進(jìn)制數(shù)據(jù)組成,則 MIME 類型說明符保持所存儲(chǔ)的二進(jìn)制信息的基類型 (Base64)。

(2) Managing Resources

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

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

添加資源:

可以通過拖放、菜單選擇來添加資源,通過資源編輯器添加到.resx文件的所有資源文件都會(huì)放到項(xiàng)目文件夾下的Resources文件夾下,如果不存在則創(chuàng)建。如果將一個(gè)已經(jīng)存在項(xiàng)目里的資源添加到.resx文件中,則這個(gè)資源不會(huì)被移動(dòng)或拷貝到Resources文件夾下,因?yàn)橘Y源編輯器是通過對(duì)文件的引用來管理資源文件,resx文件僅僅存放實(shí)際清單資源的類型信息。

刪除資源:

通過資源編輯器只能從.resx中移除或者剪切資源,而不能實(shí)際刪除,因?yàn)槟阒皇菍?duì)資源的元數(shù)據(jù)進(jìn)行操作,而并非真正的資源文件(字符串除外,它只能被嵌入)。如果從項(xiàng)目中刪除資源文件,但是.resx中的相應(yīng)元數(shù)據(jù)還在,這樣在編譯時(shí)就會(huì)出現(xiàn)編譯異常。

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

(3) Resource Persistance

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

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

如何在嵌入的資源和鏈接的資源之間進(jìn)行選擇?
-----------------------------------------------------------------
在多數(shù)情況下,應(yīng)該堅(jiān)持默認(rèn)的鏈接資源。但是,在有些情況下選擇嵌入的資源會(huì)更好。

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

鏈接的資源:
就易用性而言,鏈接的資源(默認(rèn)值)是最好的選擇??梢栽陧?xiàng)目內(nèi)部直接編輯資源,并且可以根據(jù)需要輕松添加或移除資源。
-----------------------------------------------------------------

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

如果在資源編輯器下對(duì)資源進(jìn)行管理,則會(huì)發(fā)現(xiàn)資源的BuildAction,即生成操作都會(huì)變?yōu)椤盁o”。其實(shí)Persistance屬性僅僅在設(shè)計(jì)期間起作用,最終資源數(shù)據(jù)都將編譯到可執(zhí)行文件中。

(4) Using Typed Resources

* 直接使用.resx文件

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

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 資源

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

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

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

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);
  }
}

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

Assembly asm = Assembly.GetExecutingAssembly();

// Load embedded .resources file
using(
  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;
    }
   }
  }
}

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

(5) Resource Manager

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

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

通過 ResourceManager 的方法,調(diào)用方可使用 GetObject 和 GetString 兩種方法訪問特定區(qū)域性的資源。

// Load ResourcesSample.MainForm.resources from MainForm.resx
ResourceManager 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) 強(qiáng)類型資源類

Resource Manager 提供了對(duì)資源的弱類型方法GetObject來返回資源,需要進(jìn)行類型轉(zhuǎn)換。但是VS2005和一個(gè)自定義工具 ResXFileCodeGenerator 提供了對(duì)這個(gè)問題的解決辦法。當(dāng)一個(gè) .resx 文件被保存時(shí),VS2005會(huì)應(yīng)用自定義工具將其產(chǎn)生一個(gè)相應(yīng)的 .Designer.cs 文件,此文件提供了一個(gè)名字和 .resx 文件相同的類,這個(gè)類所處的命名空間為 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 類型的兩個(gè)特征:

a. 它通過一個(gè)ResourceManager類型的屬性提供了對(duì)ResourceManager的靜態(tài)訪問,就沒必要寫之前的創(chuàng)建邏輯了; b. 通過一個(gè)Culture屬性提供了CultureInfo對(duì)象實(shí)現(xiàn)對(duì)本地化信息的靜態(tài)訪問;

提供的每個(gè)資源都是強(qiáng)類型靜態(tài)只讀屬性。在內(nèi)部實(shí)現(xiàn)中,每個(gè)屬性都由設(shè)計(jì)器生成的資源類利用托管的ResourceMananger對(duì)象產(chǎn)生的;

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

(7) Designer Resources

VS2005提供了整個(gè)項(xiàng)目的資源管理。由于Resources.resx 文件是從項(xiàng)目的屬性頁來進(jìn)行管理的,所以 VS2005將它存放到項(xiàng)目的Properties文件夾中。當(dāng)在項(xiàng)目中添加.resx文件時(shí),ResXFileCodeGenerator工具會(huì)自動(dòng)生成Resources.Designer.cs:

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

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

項(xiàng)目會(huì)自動(dòng)生成一個(gè)跟窗體關(guān)聯(lián)的.resx 文件,保存類似 BackgroundImage 和 Icon 等資源信息。屬性窗口可以打開選擇資源編輯器,允許選擇適當(dāng)?shù)膱D片資源。它提供了兩種導(dǎo)入和保存資源的方式:作為本地資源;作為項(xiàng)目資源文件。對(duì)于窗體,本地資源被嵌入到窗體設(shè)計(jì)器自動(dòng)創(chuàng)建的.resx文件中并和窗體關(guān)聯(lián),如果選擇本地資源,則可以直接將圖片導(dǎo)入到窗體的資源文件中。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于WPF實(shí)現(xiàn)繪制地鐵路線圖

    基于WPF實(shí)現(xiàn)繪制地鐵路線圖

    經(jīng)常坐地鐵,卻不知道地鐵多少條線路?哪個(gè)站下車?本文就來帶大家利用WPF繪制深圳地鐵路線圖,從而帶大家掌握WPF在圖形繪制方面的一些知識(shí),希望對(duì)大家有所幫助
    2023-06-06
  • C#?線程切換后上下文都去了哪里(.NET高級(jí)調(diào)試分析)

    C#?線程切換后上下文都去了哪里(.NET高級(jí)調(diào)試分析)

    總會(huì)有一些朋友問一個(gè)問題,在 Windows 中線程做了上下文切換,請(qǐng)問被切的線程他的寄存器上下文都去了哪里?這個(gè)問題其實(shí)比較底層,如果對(duì)操作系統(tǒng)沒有個(gè)體系層面的理解以及做過源碼分析,其實(shí)很難說明白,這篇我們就從.NET高級(jí)調(diào)試的角度分析,需要的朋友可以參考下
    2023-12-12
  • C#中關(guān)于可空類型的小知識(shí)

    C#中關(guān)于可空類型的小知識(shí)

    這篇文章主要介紹了C#中關(guān)于可空類型的小知識(shí),本文講解可空類型運(yùn)算的小技巧,需要的朋友可以參考下
    2015-04-04
  • C#實(shí)現(xiàn)json的序列化和反序列化實(shí)例代碼

    C#實(shí)現(xiàn)json的序列化和反序列化實(shí)例代碼

    這篇文章主要介紹了C#實(shí)現(xiàn)json的序列化和反序列化實(shí)例代碼,有需要的朋友可以參考一下
    2013-12-12
  • C# 結(jié)合 Javascript 測(cè)試獲取天氣信息

    C# 結(jié)合 Javascript 測(cè)試獲取天氣信息

    本文將介紹如何使用 C# 并結(jié)合 JavaScript 獲取天氣信息,獲取的數(shù)據(jù)來源于360瀏覽器首頁數(shù)據(jù),對(duì)C# 獲取天氣信息示例代碼感興趣的朋友一起看看吧
    2024-08-08
  • c# 區(qū)分幾種定時(shí)器(timer)

    c# 區(qū)分幾種定時(shí)器(timer)

    這篇文章主要介紹了c# 幾種定時(shí)器(timer)的區(qū)別,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • C#中async和await的深入分析

    C#中async和await的深入分析

    Async/Await是C# 5引入的關(guān)鍵字,用以提高用戶界面響應(yīng)能力和對(duì)Web資源的訪問能力,同時(shí)它使異步代碼的編寫變得更加容易,下面這篇文章主要給大家介紹了關(guān)于C#中async和await的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • C#簡單讀取主機(jī)上所有進(jìn)程的方法

    C#簡單讀取主機(jī)上所有進(jìn)程的方法

    這篇文章主要介紹了C#簡單讀取主機(jī)上所有進(jìn)程的方法,涉及C#進(jìn)程的遍歷讀取操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-08-08
  • 基于WPF實(shí)現(xiàn)面包屑控件的示例代碼

    基于WPF實(shí)現(xiàn)面包屑控件的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何基于WPF實(shí)現(xiàn)簡單的面包屑控件,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,感興趣的小伙伴可以了解一下
    2023-05-05
  • C#實(shí)現(xiàn)語音視頻錄制-附demo源碼

    C#實(shí)現(xiàn)語音視頻錄制-附demo源碼

    在很多語言視頻軟件系統(tǒng)中,經(jīng)常有將實(shí)時(shí)的音頻或者是視頻錄制為文件保存到磁盤空間的需求,本篇給大家講C#實(shí)現(xiàn)語音視頻錄制-附demo源碼,感興趣的朋友一起來學(xué)習(xí)吧
    2015-08-08

最新評(píng)論