2013-12-11 241 views
6

這裏我可能會遺漏一些非常簡單的東西,但使用反射從檢索嵌入資源的好處是什麼?包含資源的資源相對於只需通過.resx文件檢索它?我看到了很多,但沒有得到它 - 是否有一個原因使用Assembly.GetExecutingAssembly().GetManifestResourceStream(resource)相比,resx文件Resources.resource?即使是微軟也這麼做:How to embed and access resources資源文件(.resx)vs反射以訪問嵌入資源

我的意思是:假設我有一個程序集MyAssembly,它包含一個嵌入式資源Config.xml。該組件具有MyClass實現返回所述資源作爲字符串的方法:

public string GetConfigXML() // returns the content of Config.xml as a string 

通常情況下,我認爲這是實現這個樣子,使用反射來檢索資源:

public string GetConfigXML() 
{ 
    Stream xmlStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyAssembly.Config.xml"); 
    string xml = GetStringFromStream(xmlStream); 
    return xml; 
} 

爲什麼使用GetManifestResourceStream()時您可以:

  1. 添加一個資源文件(Resource.resx)到Visual Studio中的MyAssembly項目;
  2. Config.xml添加到資源的「文件」;
  3. 得到Config.xml內容以更簡單的方式:string xml = Resource.Config;

我不知道Studio如何視覺內部處理.resx文件,但我懷疑它只是拷貝資源到.resx文件(以哪種情況下你最終會得到重複的資源)。我認爲它不會在內部使用反射,那麼爲什麼不在這種情況下簡單地使用.resx文件,這對我來說似乎對性能更友好?

+1

通過組裝得到它*可能會爲您加載文化感知衛星程序集加載,而加載resx會​​讓您有責任爲當前文化選擇正確的。 –

回答

3

但什麼是使用反射來檢索嵌入的資源

這背後任何理由將數據從一種格式轉換爲另一種共同受益的效益。速度,速度,速度和便利性。

XML是一種相當不錯的格式,可以保存資源。您將有一個非常好的保證,即使在原始迷失的時間和一對夫婦的情況下,仍然可以在10年後檢索原始資源的機器更換沒有良好的備份。但是讀取格式非常糟糕,XML非常冗長,並且定位一個片段需要從文件的開頭讀取。

Resgen.exe將.xml文件編譯爲.resource文件時會消失的問題。一種適合鏈接到程序集元數據幷包含資源中原始字節的二進制格式。並且當程序集加載時直接映射到內存中,不需要找到另一個文件並打開它,讀取它並轉換數據。巨大差距。

是否使用Resource Designer來避免直接使用GetManifestResourceStream()。更方便。

+0

公平點,謝謝。但在我看來,如果在.resx中存儲大量資源文件,則直接資源訪問使用反射的速度優勢可能會變得很明顯,而對於少量嵌入資源,反射實際上會是與從.resx讀取相比較慢(因爲您需要'GetManifestResourceStream',然後將其轉換爲適當的格式)? – w128

+4

你似乎是從「反思緩慢」這個普遍的神話中操作。當你比較時,比如使用一個屬性直接使用Reflection來獲得一個屬性值,它會很慢。當然,你不能用Reflection來打敗納秒。與打開文件相比,GetManifestResourceStream *非*慢。它很容易快50,000倍,給出或採取一個數量級的:) –