我是如何折騰.NET Resx資源檔的 當電腦中的資源已經足夠多時,我們也要學會儘可能的借用

來源:互聯網
上載者:User

.NET Resx格式的資源檔在日常開發中用的比較多,它用來儲存常用的資源,可以是位元影像,文字檔,或是任何的電腦檔案。先來看一下,它的日常用法

直接在這裡Paste一個位元影像檔案,然後在程式中以這種方式調用,非常的簡潔明了

Bitmap bitmap = Resources.Button;

在知道這種方法之前,我一直是用Embedded Resource的方法,代碼如下

public static System.Drawing.Image GetImage(string fileName){      string path = string.Format("Foundation.Common.Resource._{0}.{1}", _language, fileName);      Assembly assembly = Assembly.GetExecutingAssembly();      Stream picture = assembly.GetManifestResourceStream(path);      return Image.FromStream(picture);}Bitmap bitmap=GetImage("Button");

前一種方式簡單,但是沒有後一種方法靈活,內嵌資源可以編程訪問,則具備相當的靈活性。比如在製作多國語言環境的程式中,簡體中文要載入zh_cn_Button檔案,英語則載入en_us_Button資源檔,在這種情況下,則推薦以內嵌資源的方式來實現。

在設計Windows Forms組件時,通常為給它賦一個表徵圖資源,代碼看起來是這樣的

[ToolboxBitmap(typeof(MyControl),"Button")]public class MyButtonControl : Control{      }

指定資源檔名是Button,請注意給它設定屬性為內嵌資源。這樣,在VS的工具箱中,它顯示表徵圖為按鈕。

指定控制項工具箱的這段代碼還有更簡潔的寫法,如下所示

[ToolboxBitmap(typeof(System.Windows.Forms.Button))]public class MyControl : Control{}

直接使用Windows.Forms的內建表徵圖,簡單明了,不過它驅使我用Reflector來看看它的究竟

你可能在問一下問題,怎樣的表徵圖才能指定給Windows控制項呢,符合怎樣的規則。如所示,開啟System.Windows.Forms.dll,另存Button.bmp這個表徵圖,在Photoshop看一下它的屬性就可以知道答案。

經過這麼一回合,我對嵌入到.NET程式集中的資源也產生了濃厚的興趣。請繼續看我的折騰手法。

來看看這個圖,它顯示了程式集中的翻譯資源字串

正規的商業程式,它的規範性是做的很好的,所以我想借用它的這些字串資源,但是直接在.NET Reflector是無法擷取到的,只可以另存新檔.resources檔案。.NET Refector的作者在創作它時,就想到了.resources格式的處理,所以它已經做好了.NET Resourcer來讀寫.resources格式的資源檔,如所示。

.NET架構經過幾個版本的更新,當初儲存在硬碟中的.NET Resourcer已經不能運行了。不過,.NET Resourcer開放了原始碼,你可以擷取它的代碼,用Visual Studio重新開啟重建一次,就不會發生執行階段錯誤。

使用這個程式來編輯.Resx檔案,那是相當的舒服。綠色,小巧,功能也足夠。可是用了一段時間,我發現了它的一個不足,就是無法把.resources中的圖片資源儲存到本地中,這是個小小的缺陷。

如所示,我想把rejected_request_16所指的圖片拷貝出來,怎麼都找不到辦法。於是,又找到這個辦法

 

這是部落格園的一位園友提供的程式,它可以把.resource檔案轉化成.resx檔案,這樣,在Visual Studio中開啟轉化後的.resx檔案,可以把需要的圖片檔案另存新檔檔案,以實現圖片檔案的提取。資源檔的格式轉化的代碼也比較簡單,直接是API的調用(ResourceReader ,ResXResourceWriter)。它的文章名字是《分享如何反編譯winform資源檔的詳解》,作者陳國立,感謝它的勞動。

再試一下開放源碼的ILSpy,它也只能把內嵌資源檔案.resource另存出來,也不是我需要的resx檔案

Visual Studio Command Line有一個工具 + 生產力,可以直接把.resource檔案轉化為resx格式,命令如下所示

ResGen.exe ERP.resources  ERP.resx

這樣也實現了.resources格式轉化為resx檔案格式。

 

掌握了上面所說的技巧,相當於已經準備好了挖掘寶藏的工具,下面的就來練一下手,看看有那些可以挖掘的寶貝資源。

Code Smith一直是我喜歡的代碼產生工具,也經常在上面做一些擴充應用。它沒有依賴于于我們熟悉的SMO或DMO來擷取資料庫的中繼資料庫,這一點我一直有些懷疑,於是用Reflector開啟一看,秘密都在這裡了

 

這張圖也解釋了大量的SQL Server中繼資料技巧,比如你要擷取SQL Server 2005的所有的資料表,可以看到Code Smith寫的代碼是這樣的

GetTables2005=SELECT

    object_name(so.id)        AS [OBJECT_NAME],

    schema_name(so.uid)        AS [USER_NAME],

    so.type                    AS TYPE,

    so.crdate                AS DATE_CREATED,

    fg.file_group            AS FILE_GROUP,

    so.id                    as [OBJECT_ID]

    FROM

    dbo.sysobjects so

    LEFT JOIN (

        SELECT

            s.groupname AS file_group,

            i.id        AS id

        FROM dbo.sysfilegroups s

            INNER JOIN dbo.sysindexes i

            ON i.groupid = s.groupid

        WHERE i.indid < 2                          
    ) AS fg

    ON so.id = fg.id

   WHERE

    so.type = N'U'

    AND permissions(so.id) & 4096 <> 0

    AND ObjectProperty(so.id, N'IsMSShipped') = 0

    AND NOT EXISTS (SELECT * FROM sys.extended_properties WHERE major_id = so.id AND name = 'microsoft_database_tools_support' AND value = 1)

ORDER BY schema_name(so.uid), object_name(so.id)

這樣,我再也不用為擷取SQL Server的中繼資料發愁了,也不用Google幫忙,這裡就有我需要的全部了。

相應的MySQL可以到SchemaExplorer.MySQLSchemaProvider.dll中去找,與Oracle相關的在SchemaExplorer.OracleSchemaProvider.dll中尋找。

 

除了前面提到的擷取資源的行為方式,我還以此觀察到了另一種程式設計的方法。請看

Solid Framework是一套非常流行的PDF檔案處理工具包。我曾經在《知識管理系統Data Solution研發日記之十四 如何以編程方式處理PDF格式文檔》中有介紹,如果需要詳細瞭解請參考那篇文章。

簡要介紹這個架構的工作方式,如所示,它把需要工作的程式,執行檔案全部壓縮到SolidFramework.dll這個程式集中的資源檔中,在啟用(Activate)PDF處理引擎後,它會把相關的執行檔案,服務程式解壓縮到一個目錄中,然後以這個目錄中的程式來處理PDF文檔。這種運用資源檔的奇怪方式,一直令我感覺驚訝,也佩服人家,把資源檔的用途發揮到了極致。

 

QQ農場中有偷菜的說法,後來有人改稱說叫摘菜,不叫偷,我這裡也學文明人的方式,叫借用,希望能對你有協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.