黑夜的狼

沮丧吗,那就是一种无病呻吟!留恋它就是一种高度近视!目光应该放得更远一点! 别不想飞,只是要一步跨过太平洋!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
总结网上向DLL里添加资源的文章,关资源路径问题有多种说法
1。:[assembly: System.Web.UI.WebResource("mynamespace/Images/myImage.gif", "img/gif")]
2。mynamespace.Include/Images/Save.gif
3.mynamespace.Include/Images.Save.gif
经过测试,在.net 4.0 下 只支持全全部使用 “.” 号
声明时要全路径,在代码中引用时也要全路径: Page.ClientScript.GetWebResourceUrl(this.GetType(), "mynamespace.Images.myImage.gif");
嵌入JS,可以直接Page.ClientScript.RegisterClientScriptResource(this.GetType(), "CustomControl.TextBoxSelect1.js");
-----------------------------------
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&amp;r=WebCtrl.cutecat.jpg&amp;t=632390947985312500" style="border-width:0px;" />     
其中的src就是GetWebesourceUrl执行后返回的,它有3个参数(这里的&被解析成了&amp;,不过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&acute;s SelectedIndexChanged 事件中,如果出来资源
System.IO.Stream stream = loadedAssembly.GetManifestResourceStream((string) resources.SelectedItem);
System.Drawing.Image img = Image.FromStream(stream);
上面的演示程序把一个装配件调入内存,在loadedAssembly变量中存储一个Assembly实例.也许在你的应用程序中,不需要调用其他装配件的资源,你只是想能从你自己的程序中得到资源.

于ASP.NET自定义控件中嵌入CSS资源

Step1:于【项目解决方案】中右键新建【ASP.NET服务器控件】项目

Step2:于项目中添加【Resources】文件夹,于该文件夹下添加【CSS文件】

Step3:单击该CSS文件,并将【属性】栏中的【生成操作】改为【嵌入的资源】

Step4:新建【ASP.NET自定义控件】,于namespace声明前添加如下特性:

[assembly:WebResource("MyControl.Resouces.MyCSSFile.css","text/css")]

namespace MyControl

{

P.S.[assembly:WebResource("namespaceName.Directories.FileName.Extention","文件的MIME类型")]

       Page.ClientScript.GetWebResourceUrl()方法返回该CSS文件路径

Step5:向宿主页面注册此CSS文件:

     protected override void OnPreRender(EventArgs e)
        {
            if (Page.Header.FindControl("ServerTabsCSS") == null)//防止同一页面多个该自定义控件向宿主页面添加相同的<link>标记
            {
                HtmlLink css = new HtmlLink();
                css.ID = "ServerTabsCSS";
                css.Href = Page.ClientScript.GetWebResourceUrl(this.GetType(), "MyControl.Resources.ServerTabs_CSS.css");
                css.Attributes.Add("rel", "stylesheet");
                css.Attributes.Add("type", "text/css");

                Page.Header.Controls.Add(css);
            }//<link type="text/css" rel="stylesheet" href="......css"/>
         

            base.OnPreRender(e);
        }

 

---------------------------------------

Asp.net 2.0自定义控件开发相关的几种嵌入资源解决方案
2008-03-03 13:04
前提: 如下将要介绍的几种类型资源都要在其属性页窗口, <生成操作> 属性, 设置为[嵌入的资源], 如图:

 

 
给自定义控件添加自定义图标的几种方案
   方法一:
          直接在自定义控件项目中添加一个 *.bmp格式的图标文件, 并将其命名
         与主控件文件相同, 扩展名为 .bmp, 比如主控件文件名为:
         CustomButton.cs, 则图标文件命名为: CustomButton.bmp . 编译项目.
         然后在工具箱中添加此控件就可以看到刚刚设置的图标效果.
   方法二:
          图标文件名称与主控件名称不同时, 在类前如下设置.
 
[ToolboxBitmap(typeof(CustomButton), @"CustomButton1.bmp")]
public class CustomButton : CompositeControl, INamingContainer
{
       //.;
}
 
编译项目,然后在工具箱中添加此控件就可以看到刚刚设置的图标效果.
 
 
   方法三:
            图标文件名称与主控件名称不同时, 用本机绝对路径. 如下:
 
          [ToolboxBitmap(@"E:\net\CustomButton(测试资源
           文件)\CustomButton\CustomButton1.bmp")]
         
           编译项目,然后在工具箱中添加此控件就可以看到刚刚设置的图标效果.
 
      
►  自定义控件嵌入JavaScript 文件资源
           1. 定义元数据属性
            [assembly: WebResource("CustomButton.CustomButton_JScript.js",
              "application/javascript")]
           namespace CustomButton
           {
                //.;
           }
 
           其中 WebResource 的参数1为: 控件命名空间 + . + JS脚本文件名称
      2. 使用
 
if (!Page.ClientScript.IsClientScriptIncludeRegistered
("MyJavaScript"))
        {
                Page.ClientScript.RegisterClientScriptInclude
               ("MyJavaScript",Page.ClientScript.GetWebResourceUrl
               (this.GetType(), " CustomButton. CustomButton _JScript.js"));
        }
 
►  自定义控件嵌入图片(gif/jpg ) 文件资源
        1. 定义元数据属性
           
         [assembly: WebResource("CustomButton.NoPic.gif", "image/gif")]   
           namespace CustomButton
          {
                 //.;
           }
 
        2. 使用
 
          string strImageSrc = Page.ClientScript.GetWebResourceUrl
                (this.GetType(), "CustomButton.NoPic.gif");
           System.Web.UI.WebControls.Image img = new
               System.Web.UI.WebControls.Image();
          img.ImageUrl = strImageSrc;



控件命名空间 + . + XXX.XXX文件名称

命名空间为 项目属性中的默认命名空间名称
XXX.XXX 为项目根目录到文件的全路径

eg:  
命名空间为:
LCS.Controls

文件在项目中的层次路径为:
/Include/Images/Save.gif

则引入的资源图片应该为:
LCS.ControlsInclude/Images/Save.gif
 
posted on 2011-03-05 16:07  anncesky  阅读(512)  评论(0)    收藏  举报