.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農場中有偷菜的說法,後來有人改稱說叫摘菜,不叫偷,我這裡也學文明人的方式,叫借用,希望能對你有協助。