博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# DLL资源文件打包(图片、JS、CSS)[WebResource]
阅读量:6002 次
发布时间:2019-06-20

本文共 3864 字,大约阅读时间需要 12 分钟。

正题

    先看下我的最终的目录结构(这是工程结构就是 英文原站下载的代码):
    
    这里需要说明几点:
    1.    对于以下这行资源注册代码放在AssemblyInfo.cs中和放在DLL中任何类的namespace前效果是一样的。(我个人建议统一放在AssemblyInfo.cs中便于统一管理)

[assembly: WebResource(
"
FunkyTextBox.Resources.test.jpg
"
"
image/jpeg
"
)]

    2.    资源文件在DLL中的位置和访问是有关系的!!我把图上test.jpg放在根目录和放在Resources目录下访问起来是不一样的,注册资源的时候就是根据这个来(也就是说如果放在根目录的话注册资源的名称就是"FunkyTextBox.test.jpg")。

    

    现在我们先分析FunkyTextBox他原来的代码架构,也是很多网上示例的架构:

    1.    把资源文件拷贝到项目中
    2.    编写自己的用户控件,继承WebControl如TextBox,也就是说在DLL内部调用资源文件
    3.    在用户控件中注册资源(也可以在AssemblyInfo.cs中)
    基本上看到的都是在DLL内部调用资源文件然后再从外部引用该自定义控件。这里我主要讨论的是想在外部直接引用DLL内部的资源文件,相信很多朋友和我一样,把DLL内部引用资源文件的代码复制出来拷贝到ASPX里面图片怎么都出不来,包括注册httphandles里面截获WebResource.axd也不管用。直到在MSDN上看到那段代码才有所感悟:

using
 System;
using
 System.Web;
using
 System.Web.UI;
using
 System.Security.Permissions;
[assembly: WebResource(
"
Samples.AspNet.CS.Controls.script_include.js
"
"
application/x-javascript
"
)]
namespace
 Samples.AspNet.CS.Controls
{
    [AspNetHostingPermission(SecurityAction.Demand, Level 
=
 AspNetHostingPermissionLevel.Minimal)]
    
public
 
class
 ClientScriptResourceLabel
    {
        
//
 Class code goes here.
    }
     
}

 

<%
@ Page Language
=
"
C#
"
%>
<%
@ Import Namespace
=
"
Samples.AspNet.CS.Controls
"
 
%>
<!
DOCTYPE html PUBLIC 
"
-//W3C//DTD XHTML 1.0 Transitional//EN
"
    
"
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
"
>
<
script runat
=
"
server
"
>
  
public
 
void
 Page_Load(Object sender, EventArgs e)
  {
    
//
 Define the resource name and type.
    String rsname 
=
 
"
Samples.AspNet.CS.Controls.script_include.js
"
;
    Type rstype 
=
 
typeof
(ClientScriptResourceLabel);
    
//
 Get a ClientScriptManager reference from the Page class.
    ClientScriptManager cs 
=
 Page.ClientScript;
    
//
 Write out the web resource url.
    ResourcePath.InnerHtml 
=
 cs.GetWebResourceUrl(rstype, rsname);
    
//
 Register the client resource with the page.
    cs.RegisterClientScriptResource(rstype, rsname);
  }
</
script
>
<
html  
>
  
<
head
>
    
<
title
>
ClientScriptManager Example
</
title
>
  
</
head
>
  
<
body
>
     
<
form id
=
"
Form1
"
 runat
=
"
server
"
>
     The web resource path 
is
 
     
<
span  id
=
"
ResourcePath
"
 runat
=
"
server
"
/>
.
     
<
br 
/><
br 
/>
     
<
input type
=
"
text
"
 id
=
"
Message
"
 
/>
     
     
<
input type
=
"
button
"
 onclick
=
"
DoClick()
"
 value
=
"
ClientClick
"
 
/>
     
</
form
>
  
</
body
>
</
html
>

为了方便直接看到效果,我把上面从DLL中读取JS的代码改成了从DLL中读取图片的代码,改动如下

1.    将ClientScriptResourceLabel命名空间改为FunkyTextBox
2.    将资源注册代码改成如下(注意资源路径):

[assembly: WebResource(
"
FunkyTextBox.Resources.test.jpg
"
"
image/jpeg
"
)]

3.    为ASPX页面添加一个图片按钮并把读取的相应改成如下:

<
script runat
=
"
server
"
>
    
public
 
void
 Page_Load(Object sender, EventArgs e)
      {
        
//
 Define the resource name and type.
        String rsname 
=
 
"
FunkyTextBox.Resources.test.jpg
"
;
        Type rstype 
=
 
typeof
(ClientScriptResourceLabel);
        
//
 Get a ClientScriptManager reference from the Page class.
        ClientScriptManager cs 
=
 Page.ClientScript;
        
//
 Write out the web resource url.
        imgpath.Src 
=
 cs.GetWebResourceUrl(rstype, rsname);
        
//
ResourcePath.InnerHtml =
        
//
 Register the client resource with the page.
        
//
cs.RegisterClientScriptResource(rstype, rsname);
      }
</
script
>
<
html xmlns
=
"
http://www.w3.org/1999/xhtml
"
 
>
<
head runat
=
"
server
"
>
    
<
title
>
WebResources
</
title
>
</
head
>
<
body
>
    
<
form id
=
"
form1
"
 runat
=
"
server
"
>
    
<
div
>
    
<
img runat
=
"
server
"
 id
=
"
imgpath
"
 alt
=
""
/>
    上面访问代码可以简化如下:

mgpath.Src 
=
 ClientScript.GetWebResourceUrl(
typeof
(FunkyTextBox), 
"
FunkyTextBox.Resources.test.jpg
"
);

    由上面的代码我们可以看得出,ClientScriptResourceLabel类里面是空的,唯一有用的就是注册了一下资源,接下来我们把ClientScriptResourceLabel里面的资源注释掉,把资源注册到AssemblyInfo.cs中,也能够正确显示。这就让我纳闷了!type指向的是一个空的类也能够显示资源,但是我用this.GetType()或用typeof(_Default)通通都不行!!我猜想这个GetWebResourceUrl第一个参数只需要我们把他指引向正确的DLL空间就行了,然后就可以找到资源了!?还有我用Assembly.Load("FunkyTextBox").GetType()来指定Type也是不行的,感觉还是学得比较浅:)

    现在基本能达到我的直接访问内部资源文件的要求了,只是需要多一个空类来指定type,暂时满足我的要求,目前可以考虑把JS放到这个里面来,这样一来如果拷贝生成JS的SRC链接直接访问可是不行的哦!就到这里,欢迎多多交流!

 

本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/586490,如需转载请自行联系原作者

你可能感兴趣的文章
《指针的编程艺术(第二版)》一1.5 练习
查看>>
Angular从零到一3.1 建立routing的步骤
查看>>
《jQuery Cookbook中文版》——1.9 根据当前上下文遍历DOM获得新的DOM元素集
查看>>
《七周七并发模型》第五章Actor总结
查看>>
《jQuery Mobile快速入门》—— 2.6 带有媒体查询的响应式布局
查看>>
《C++面向对象高效编程(第2版)》——2.2 对象接口的重要性
查看>>
《Hadoop MapReduce性能优化》一1.1 MapReduce模型
查看>>
《Access 2007开发指南(修订版)》一一2.15 小结
查看>>
ROS机器人程序设计(原书第2版)3.2 日志信息
查看>>
五个 ping 工具的使用实例
查看>>
在Linux系统下玩《炉石传说:魔兽英雄传》
查看>>
阿里数据库内核月报:2016年01月
查看>>
Samba 系列(七):在 Samba AD DC 服务器上创建共享目录并映射到 Windows/Linux 客户...
查看>>
The Joy of Clojure – Clojure philosophy(1)
查看>>
Apache Storm 官方文档 —— 多语言接口协议
查看>>
在 Linux/UNIX 终端下使用 nload 实时监控网络流量和带宽使用
查看>>
小白学数据:一文看懂NoSQL数据库
查看>>
Android开发切换host应用
查看>>
SCALA中的函数式编程
查看>>
阿里云ApsaraDB RDS用户 - OLAP最佳实践
查看>>