熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

淺析VisualBasic.NET中的資源使用

2022-06-13   來源: .NET編程 

  在我了解到的程序世界中資源的初次登場是因為程序的國際化當時的可執行文件已不再是單調的英文面孔漢語西班牙語等國際語言的支持強烈要求同樣的程序可以使用不同的語言界面在當時將程序邏輯代碼和提示信息分離是一個不錯的主意堤示信息分離出來成為一個資源文件而獨立存在在程序進行編譯時再由編譯器鏈接到可執行文件中直到現在資源在這個方面依然扮演著重要的角色以下以的一個小例子說明資源的存在

  例一時下許多網上的軟件都有什麼多國語言版之類的說法實在點就是同一程序在安裝或使用過程中有個國家區域選項當你選擇了對應的國家時程序就會顯示使用相應國家語言的界面其實在編程實現這種功能非常簡單只不過是使程序同時嵌入幾個不同語言的資源文件而已以下示例就是一個同時支持英文和中文界面的示例程序程序創建完整步驟如下

  在中新建一個項目類型選擇windows應用程序項目名稱改為resourcesample

  在form上放一個Lable控件

  選擇窗體form按以下指示設置屬性:

  ()Locallizable 屬性設為True這一步是關鍵這個屬性告訴net環境要使用資源文件來保存窗體及窗體內的各種控件的屬性值

  ()選擇窗體的language屬性將其設為英語然後按下表設置窗體及lable控件的其它屬性:

控件名稱 屬性 屬性值 Form text Form Label Text Lets speak English!
  窗體外觀如下


淺析VisualBasic.NET中的資源使用(圖一)
  ()重新選擇窗體的language屬性將其設為中文(簡體)然後按下表設置窗體及lable控件的其它屬性:

控件名稱 屬性 屬性值 Form text 窗體 Label Text  

讓我們說中文!

  窗體外觀如下


淺析VisualBasic.NET中的資源使用(圖二)
  大家也許很奇怪為什麼要對窗體及label的text屬性進行兩次不同的賦值呢?其實答案很簡單太聰明了由於我們使用Locallizable 屬性告訴net環境要使用資源文件來保存窗體及窗體內的各種控件的屬性值當使用不同的language屬性它會將窗體及其上控件的屬性按語言分別記錄在不同的資源文件內不信你將language屬性重新設為英語看看第一個英文界面的窗體又跳出來了吧D
如果說可視化編程是光明之途的話那麼我們的快樂時光到此結束由於net還沒有智能化到會判斷什麼時候使用什麼國家的語言界面的程度(如果net 太智能了程序員就不幸了下崗啊誰受得了?!)所以以下必須由我們自己編寫代碼確定程序的實際界面顯示

  打開 form的New過程在InitializeComponent()前加入如下代碼(這段代碼作用是在窗體初始化組件之前按指定的語言區域信息載入相應的界面資源文件)

Dim tenmDialogResult As DialogResult
tenmDialogResult = MessageBoxShow(請問是使用中文還是英語中文選擇OK英文選擇CANCEL _
語言選擇 _
MessageBoxButtonsOKCancel _
MessageBoxIconQuestion _
MessageBoxDefaultButtonButton _
MessageBoxOptionsDefaultDesktopOnly)
  REM 一般情況下程序都是使用讀取初始化文件的方法來取得語言設置信息

但本例程為了簡便起見僅使用一個對話框提示用戶選擇適合自己的語言

If tenmDialogResult = DialogResultOK Then 使用中文界面
gstrAppCulture = zhCHS
Else 使用英文界面
gstrAppCulture = en
End If

將需要使用的區域信息放到當前線程的區域信息中
程序窗體會根據設定的信息裝載相應的資源文件以顯示信息
SystemThreadingThreadCurrentThreadCurrentUICulture = _
New SystemGlobalizationCultureInfo(gstrAppCulture)

  剩下的事這沒什麼好說的了按運行吧在出現對話框時試著點OK或Cancel看看你的傑作吧很酷的同時支持中英文界面的示例程序哦

偉大的思想家會說我們要透過現象看到事物的本質我雖說對哲學不感興趣但對net在後台到底瞞著我干了些什麼見不得光的勾當還是非常好奇的點擊解決方案資源管理器點擊顯示所有文件的按紐很驚奇地發現在formvb下出現了幾個後綴名為resx的文件這些家伙就是本文要說明的資源文件了(留意一下資源文件的文件名包含的en和zhCHS的字符這就代表該資源文件儲存的語言內容en為英文zhCHS為簡體中文)

         淺析VisualBasic.NET中的資源使用(圖三)

  雙擊formenresx看一下資源文件是如何儲存界面的語言信息的

   淺析VisualBasic.NET中的資源使用(圖四)

點擊查看大圖


  左邊的數據源顯示資源文件的實際數據(data)以及資源文件的文件版本信息(resheader)我只關心資源文件的實際數據儲存右邊的表列出了儲存的數據:很顯然name代表控件的屬性(其實是引用資源數據的鍵)後面的value代表對應鍵的實際數據(在程序中界面顯示的值就靠這裡了你可以試著把Lets apeak English改一下然後運行一下程序看看)comment代表注釋type代表數據的類型mimetype就是資源數據的MIME 類型(當你窗體或picturebox存有圖片時你會看到這裡有一個很長的值由於這個對編程作用不大不作解釋)我們還可以在這個界面中插入新的資源數據只要填寫好name和value就可以了

  明白了資源文件後我們再看一下代碼中是怎樣引用這引些值的打開窗體的代碼編輯器展開Windows 窗體設計器生成的代碼這一代碼段找到窗體的Private Sub InitializeComponent()過程

  第一句為:

Dim resources As SystemResourcesResourceManager = New SystemResourcesResourceManager(GetType(Form))

  這句代碼的含義就是產生一個resourcemanager對象來對form的資源文件進行控制由於net 會根據線程的區域屬性調用窗體的不同語言的資源文件所以我們前面示例中將改變線程區域信息的代碼放在InitializeComponent()過程之前以便net在創建resources對象時調用正確的語言資源文件

  接下來就是一大堆對控件屬性進行賦值的語句了看一下label的text 屬性是如何賦值的就會明白資源數據的使用方法了

MeLabelText = resourcesGetString(LabelText)

  很簡單使用ResourceManager的方法就可以獲得實際需要的資源數據了必要時可以可以使用getobjcet方法取得數據然後再用Ctype將其轉為指定的類型

  寫到這兒本來按原計劃我是想收筆的但是天氣依然陰沉沉很悶干脆就將資源使用的終極殺招也介紹一下好了資源發展到現在已不權是簡單地解決程序國際化的界面方面了在net中可以使用資源將任意文件嵌入到你的可執行文件中在需要時再用流的方式讀出使用(是任意文件哦而且方法非常簡單)好象很酷的樣子吧以下我就用另一個示例說明一下

示例在net中可執行文件中嵌入一個文本文件

  以前我做程序版權使用協議信息總是放在一個txt文本文件中打包時和可執行文件放在一起在安裝時釋放到程序的安裝路徑然後再打開使用這種做法有兩大壞處一是這個文件很容易被其它人修改二是可以套用蠟筆小新的一句話這種做法太不成熟了吧!現在我使用一個新的方法就是將協議和可執行文件結合在一起在程序運行時讀出使用當然這就全靠資源的作用了步驟如下

  在中新建一個項目類型選擇windows應用程序項目名稱改為resourcesample

  點擊項目菜單選擇添加現有項接著會彈出一個文件對話框將文件類型改為所有文件後選擇要嵌入的txt文件(其實這時你可選擇任意文件只要你喜歡*接著你會在解決方案資源管理器中發現你新加入的文件名如圖

           淺析VisualBasic.NET中的資源使用(圖五)

  關鍵的一步到了在解決方案資源管理器中點擊你剛加入的文件名然後在屬性窗體中將 加成操作 這一屬性改為嵌入的資源這將告訴net剛加入的文件將會作為資源鏈接進可執行文件中留意一下文件名哦這在後面的程序中也很重要強烈建議使用小寫文件名!如下圖


淺析VisualBasic.NET中的資源使用(圖六)
  接下就是在程序中用代碼讀出這個文件的內容

  在Form_Click事件中加入代碼如下所示

Private Sub Form_Click(ByVal sender As Object ByVal e As SystemEventArgs) Handles MyBaseClick
Dim tobjStream As IOStream = MeGetTypeAssemblyGetManifestResourceStream(resourcesampleLicensetxt)
Dim tobjStreamReader As New IOStreamReader(tobjStream SystemTextEncodingDefault)
Dim tstrLicense As String = tobjStreamReaderReadToEnd
如果是圖象就可以使用dim tobjBMP as new bmp(tobjstrem)的方法直接得到資源內容
MessageBoxShow(tstrLicense)顯示剛才讀得的結果
End Sub
  在此對上述代碼進行一點解釋net是通過Assembly的GetManifestResourceStream讀出嵌入在可執行文件的資源並以IOStream對象返回(反正得到了這個流就好象你時進行文件流操作讀/寫到磁盤或象我一樣在程序內部處理都由你自己決定了)這個方法的唯一參數是資源的唯一標識是按如下方式組成的程序集的根命名空間++資源在屬性窗口顯示的文件名(這是區分大小寫的在上文已提醒你注意了哦而且這個標識法在C#中是不同的別問我為什麼誰叫你不和我一樣使用

  程序集的根命空間的名你可以從項目菜單下的XXXX(XXXX是你的項目名稱可不要認為是罵人的話)屬性中看到


淺析VisualBasic.NET中的資源使用(圖七)
點擊查看大圖

  其余的代碼就是以流方式讀文件了很簡單吧

  按生成菜單下的生成解決方案然後到你可執文件的目錄下看看你會發現除了可執行文件外沒有別的文本文件因為文本文件已以資源的方式存在於可執行文件中啦運行一下看看效果啊(一些想做黑客的菜鳥又有什麼怪怪的想法藏木馬?……)

  資源的使用就介紹到此為至吧窗外依然小雨菲菲在虛幻的網絡和殘酷的現實邊緣排徊久了寫文章都有點怪怪的請大伙兒原諒祝大伙編程愉快
 


From:http://tw.wingwit.com/Article/program/net/201311/13715.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.