問題的引入
在編程過程中遇到下面這樣一個問題:
有這樣一個方法:
public
static
AlphaImage CreateFromResource(
string
imageResourceName)
{
MemoryStream stream =
(MemoryStream)Assembly.GetCallingAssembly().GetManifestResourceStream(imageResourceName);
return
CreateFromStream(stream);
}
在調用的時候總是得到stream是null.爲什麼呢?
看看我們的調用和程序的架構:
bgPixBox.Image = AlphaImage.CreateFromResource(
"AlphaMobileControls35Test.Resources.Wallpaper.jpg"
);
alphaPictureBox1.Image = AlphaImage.CreateFromResource(
"AlphaMobileControls3.5Test.Resources.Toolbar.png"
);
btn1.BackgroundImage = AlphaImage.CreateFromResource(
"AlphaMobileControls3.5Test.Resources.Btn1.png"
);
btn1.ActiveBackgroundImage = AlphaImage.CreateFromResource(
"AlphaMobileControls3.5Test.Resources.Btn1_Pushed.png"
);
btn1.DisabledBackgroundImage = AlphaImage.CreateFromResource(
"AlphaMobileControls3.5Test.Resources.Btn1_Disabled.png"
);
問題的解決方法
上面的方法本沒有錯,調用也完全沒有錯,可是爲什麼就是不成功呢?大家看上面架構的項目名稱,默認的情況下命名空間和項目名稱是一樣的,因此上面的調用就出錯了.解決方法法,把命名空間中帶”.”(點)的都去掉,這樣就ok。因爲命名空間中帶點會讓上面的方法在找路徑時找不到。
總結
VB.Net中資源的名稱爲:項目默認命名空間.資源文件名
C#中則是:項目命名空間.資源文件所在文件夾名.資源文件名
用GetManifestResourceStream獲取的資源要保證包含在工程中,不包含在工程中即使在同一目錄下也沒用。包含在工程中以後把該文件的“屬性”中的“生成操作”改爲“嵌入的資源”。就可以用了
通過GetManifestResourceNames(好像是這個名字)把所有的名字都取出來,然後看看有沒有你要的。一般是Assembly名.類名.Manifest.Resource。
// 獲取當前類庫的程序集
Assembly assembly = Assembly.GetExecutingAssembly();
// 從程序集中讀取插件的菜單和工具欄配置信息(xml文件內容)TestPlugin.Properties.Resources
Stream stream = assembly.GetManifestResourceStream(“資源文件名稱”);
上面的解決方案再wince中一樣可以使用。