1. 程式人生 > >資原始檔打包到Web自定義控制元件中應用

資原始檔打包到Web自定義控制元件中應用

ASP.NET 2.0提供的Web Resources管理模型,很好的解決了image、css、script等外部資源的管理問題。解決方案如下:
1.設定你需要打包的檔案的Build Action property為Embedded Resource.
2、註冊資原始檔:
(1)一般情況下,在AssemblyInfo.cs中,也可在控制元件任何原始檔(.cs)的最高階namespace外中:
[assembly: System.Web.UI.WebResource("mynamespace/myImage.gif", "img/gif")]
[assembly: System.Web.UI.WebResource("mynamespace/myStylesheet.css", "text/css")]
[assembly: System.Web.UI.WebResource("mynamespace/myJavascript.js", "text/js")]
引數說明:第一個是資源的名字,第二個是資源的mime-type名。
資源的名字命名一般包括三個部分:<預設的名稱空間.><擴充套件命名稱空間.><檔名>
預設的名稱空間就是專案的名稱空間,檔名就是資原始檔的名稱。
中間擴充套件名稱空間就是專案中的目錄結構.如果你的資原始檔就在專案的根目錄下,擴充套件名稱空間就不需要了,直接這樣寫就可以了. <預設的名稱空間.> <檔名>. 但是如果你在專案中產生目錄結果
的話,就要使用使用擴充套件名稱空間了。例如,假設以上資原始檔存在目錄Images下:[assembly: System.Web.UI.WebResource("mynamespace/Images/myImage.gif", "img/gif")]

3、使用資源
(1)對於影象處理
Image theImage = new Image();
theImage.ImageUrl =Page.ClientScript.GetWebResourceUrl(this.GetType(), "myImage.gif");

一個對 GetWebResourceUrl 的呼叫生成一個指向名為 WebResource.axd 的內建 HTTP 處理程式的 URL。這個動態生成的 URL 還包含一個查詢
字串,來識別目標 DLL 的名稱和嵌入的資原始檔。通過載入一個名為 AssemblyResourceLoader 的自定義 HttpHandler 類,ASP.NET 執行時可以響應 WebResource.axd 的請求。
上面的語句返回給browser程式碼是:
<img src="WebResource.axd?a=pWebCtrl&r=WebCtrl.cutecat.jpg&t=632390947985312500" style="border-width:0px;" />     
其中的src就是GetWebesourceUrl執行後返回的,它有3個引數(這裡的&被解析成了&,不過IIS也認的),第一個引數a是就是通過typeof(WebCustom)來確定的assembly的名字,第二個引數r很明顯就是資源的名字了,第三個引數t是一個a所指的assembly的timestamp。這個t是為了讓資源的引用能享用browser快取的優化,因為IE對相同的url有自己的cache機制。又因為這個r同時又是使用者assembly檔案的timestamp,如果使用者更新了程式碼,重新編譯後t也會變化,這樣也就保證了browser能獲得最新的資源更新。如果我們能確定嵌入資源是確實不用再更新的,我們可以在typeof()裡寫一個bcl裡的型別,比如typeof(string),那麼他將只在freamwork升級後才會變動這個t。
當然這個WebResource.axd是不存在的,它只是IIS中的一個ISAPI影射。

(2)對於CSS處理
string includeTemplate ="<link rel='stylesheet' text='text/css' href='{0}' />";
string includeLocation =Page.ClientScript.GetWebResourceUrl(this.GetType(), "myStylesheet _Links.css");
LiteralControl include =new LiteralControl(String.Format(includeTemplate, includeLocation));
((HtmlControls.HtmlHead) Page.Header).Controls.Add(include);
(3)對於JavaScript處理
string scriptLocation =
      Page.ClientScript.GetWebResourceUrl(this.GetType(), "MSDWUC_WindowStatus.js");
Page.ClientScript.RegisterClientScriptInclude("MSDWUC_WindowStatus.js", scriptLocation);

最簡單的方法是使用Type類的Assembly屬性來得到某一個類的一個例項,你可以用下面的方法來得到Type,如果是一個類,使用typeof(<class>),如果是一個類的例項變數,使用GetType().

以下演示程式會列舉出一個裝配件中的資源,可以把存選中的資源保到一個檔案中.如果資源是一個圖象,在程式中就可以顯示出來.如果你還沒有一個內嵌資源的裝配件,第二個演示程式就是一個含有資源的裝配件.
這是在ListBox的 ListBox´s SelectedIndexChanged 事件中,如果出來資源
System.IO.Stream stream = loadedAssembly.GetManifestResourceStream((string) resources.SelectedItem);
System.Drawing.Image img = Image.FromStream(stream);
上面的演示程式把一個裝配件調入記憶體,在loadedAssembly變數中儲存一個Assembly例項.也許在你的應用程式中,不需要呼叫其他裝配件的資源,你只是想能從你自己的程式中得到資源.