C# DLL资源文件打包(图片、JS、CSS)[WebResource]

前言
    出于安全以及移植考虑,近两天有看关于WebResource方面的资料,有点点心得和不明白。这里鄙视下那些狂抄袭的论坛和博客,一搜索几乎全一样,也没多说一个字的!!

感谢
    1.MSDN    直到这个例子出现,我才真正做出自己想要的东西,但是也带来了一些不明白
    2.利用WebResource.axd通过一个URL来访问装配件的内置资源(译)    这篇文章给了我基础代码
    3.在自定义Server Control中捆绑JS文件    这是一篇好文章,虽然没有用到,但是值得推荐

正题
    先看下我的最终的目录结构(这是工程结构就是利用WebResource.axd通过一个URL来访问装配件的内置资源(译) 英文原站下载的代码):
    
    这里需要说明几点:
    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链接直接访问可是不行的哦!就到这里,欢迎多多交流!

 

补充——代码下载[2008-9-24]:

     当时写的Demo,是在别人的源码基础上改的:http://files.cnblogs.com/over140/FunkyTextBox.rar

转载:http://www.cnblogs.com/over140/archive/2008/07/10/1239944.html

时间: 2024-09-03 16:16:50

C# DLL资源文件打包(图片、JS、CSS)[WebResource]的相关文章

给PHPLIB模版加两个函数,解决模版文件内图片、CSS和JS包括路径问题

加了两个函数,用法和原来的一样,具体看代码里面说明.只是在声明的时候要指定图片的路径,默认为当前目录,也就是PHP文件所在目录.注意的是图片目录要相对于模版文件目录的,模版文件和图片文件不能在同一级目录下. <?php /* * Session Management for PHP3 * * (C) Copyright 1999-2000 NetUSE GmbH *                    Kristian Koehntopp * * $Id: template.inc,v 1.5

实现php加速的eAccelerator dll支持文件打包下载_php实例

选择下载对应您的系统和PHP版本的eAccelerator 2.将其重命名为 eaccelerator.dll (win版) 然后移至您的 php目录下 的 ext文件夹中 3.在c:\php\建立缓存文件夹 temp 修改权限为 user组可读写 3.根据您系统的情况,一般都是PHP 扩展 ISAPI 打开php.ini文件, 找到extension=php_zip.dll, 在下面添加 zend_extension_ts="C:\php\ext\eaccelerator.dll" 

如何在DNN模块中插入一个图片--在模块中引用资源文件

DNN永远都是运行在网站的根目录 DNN的设计上最大的特点就是始终是使用一个网站根目录下的Default.aspx文件加载皮肤和模块从而实现整个网站的页面.这也就是说DNN这个Asp.net程序永远是运行在DNN网站的根目录的,所有的资源文件(如:JS文件,图片,CSS)的引用都要从DNN网站的根目录算起. 这么说有点难以理解,举个例子吧: 假设你把DNN安装到了一个虚拟目录下面,比如DotNetNuke_2目录下,那么你输入http://localhost/DotNetNuke_2就可以访问到

从资源文件里加载文件(C#)

加载 1.概述: 资源文件很早就有了,在.Net时代里这个东西也不算稀奇,在进行多国语言化的时候通常把不同翻译的文字存放到资源包里.以前资源文件除了放字符串以外,还可以放文件.不过在C#的工程里面,资源管理面板是空的(vc++工程里资源面板可以使用),无法直接编辑资源属性,不过每个WinForm都会带一个.resx的文件,这个文件就是WinForm的资源文件.如果通过添加新项目的方法,给工程里添加资源文件的话,产生的也是.resx文件.估计.resx文件是.net给c#新设计的资源文件格式..r

Java或者JAR包获取读取资源文件的路径的问题总结

这里分为具体两种:  第一种:资源文件为一般后缀文件  第二种:资源文件为图片文件  [NO1]第一种    使用这行代码可以获取class类的根目录的路径    String path =Thread.currentThread().getContextClassLoader().getResource("").getPath();  例子:我用的开发软件MyEclipse 6.5  假设项目文件夹如下:     files---bin--core(生成class包)        

如何在C#中创建和使用资源文件

在C#中可以使用. Resources文件来保存各种类型的文件.下面我就举例说明如何创建和使用资源文件.首先是创造一个资源文件 System.Resources.ResourceWriter myResource = new System.Resources.ResourceWriter("you.resources"); myResource.AddResource("yangming", Image.FromFile("F:\\ym.jpg"

对网站中的js,css文件进行打包

一,为什么要用smarty进行打包 apache中也有给js,css这样的静态文件进行打包压缩的模块,但是本文所说的不是以这种方式进行的打包,而是和smarty结合的方式来把网站中的js,css文件进行打包. 为什么要进行打包呢,主要目的是为了合理的管理自己的代码 .现在有好多网站,你查看一下网站的源码的话,你会发现网站的头部有大量的JS文件和CSS文件,网站的尾部也有可能有大量的JS文件.以webqq为例吧: Java代码   <script type="text/javascript&

控件注册 - 利用资源文件将dll、ocx打包进exe文件(C#版)

原文:控件注册 - 利用资源文件将dll.ocx打包进exe文件(C#版)       很多时候自定义或者引用控件都需要注册才能使用,但是如何使要注册的dll或ocx打包到exe中,使用户下载以后看到的只是一个exe,点击直接运行呢?就像很多安全控件,如支付宝的aliedit.exe那样.         现在介绍一种使用资源文件,将dll.ocx打包进exe,点击直接注册的例子:       首先,新建一个工程RegisterFile.  新建文件夹Resource,里面添加需要注册的ocx或

maven 打包jar文件时可以加入前台资源吗?如js,jsp等

问题描述 maven打包jar文件时可以加入前台资源吗?如js,jsp等 解决方案 解决方案二:可以的,但是有什么用吗/?解决方案三:引用1楼jia20003的回复: 可以的,但是有什么用吗/? 怎么加啊解决方案四:一样的加的啊.解决方案五:改pom文件,<packaging>war</packaging> 静态内容放在src/main/webapp解决方案六:可以啊!打war吧解决方案七:你用maven命令去打包就会自动加入前台的页面啊解决方案八:进入到项目下:1.mvn-cle