GetManifestResourceStream得到的Stream是null的解決

問題的引入

在編程過程中遇到下面這樣一個問題:

有這樣一個方法:

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");

程序架構

GetManifestResourceStream得到的Stream是null的解決 - xian827991006 - xian827991006

問題的解決方法

上面的方法本沒有錯,調用也完全沒有錯,可是爲什麼就是不成功呢?大家看上面架構的項目名稱,默認的情況下命名空間和項目名稱是一樣的,因此上面的調用就出錯了.解決方法法,把命名空間中帶”.”(點)的都去掉,這樣就ok。因爲命名空間中帶點會讓上面的方法在找路徑時找不到。

總結

VB.Net中資源的名稱爲:項目默認命名空間.資源文件名

C#中則是:項目命名空間.資源文件所在文件夾名.資源文件名

用GetManifestResourceStream獲取的資源要保證包含在工程中,不包含在工程中即使在同一目錄下也沒用。包含在工程中以後把該文件的“屬性”中的“生成操作”改爲“嵌入的資源”。就可以用了

通過GetManifestResourceNames(好像是這個名字)把所有的名字都取出來,然後看看有沒有你要的。一般是Assembly名.類名.Manifest.Resource。

// 獲取當前類庫的程序集
Assembly assembly = Assembly.GetExecutingAssembly();
// 從程序集中讀取插件的菜單和工具欄配置信息(xml文件內容)TestPlugin.Properties.Resources
Stream stream = assembly.GetManifestResourceStream(“資源文件名稱”);

上面的解決方案再wince中一樣可以使用。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章