在整个Webresource.axd中使用嵌入式WebResource

时间:2011-04-21 14:54:39

标签: asp.net webresource.axd

问题很简单:如何在asp.net应用程序中使用嵌入式资源?在程序集中包含资源以及如何引用它的步骤是什么?可能遇到的问题是什么?

2 个答案:

答案 0 :(得分:5)

在花了半天的时间后,我学会了这些:

  1. 要嵌入资源,需要将构建操作设置为嵌入式资源(在VS解决方案资源管理器中右键单击文件 - >属性)

  2. 必须修改 AsssemblyInfo.vb 以使此资源可用于WebResource查询。将[Assembly: System.Web.UI.WebResource("MyWebResourceProj.Test.css", "text/css")]添加到位于项目的MyProject文件夹中的AssemblyInfo.vb。

    • 名称由根命名空间/程序集名称+'。'+ filename组成。要100%确定名称,请使用以下代码段进行查找:
      Dim resNames = Assembly.LoadFile("YourDll.dll").GetManifestResourceNames()
    • 请注意,程序集的根命名空间必须与程序集名称相同(这需要我花费大约4个小时才能实现。至少在.Net v4中就是这种情况)
    • 如果css(<%= WebResource(“NS.image.jpg”)%>)中有引用,则为该css的WebResource属性传递PerformSubstitution:= true。
  3. 可以使用Page.ClientScript.GetWebResourceUrl(GetType(MyWebResourceProj.ConssumingPage), "MyWebResourceProj.Test.css")

    来引用资源
    • 请注意,可以使用Me.GetType()代替GetType(Typename),但是如果继承了该类,那么这将无效,所以要小心!
  4. 资源:

答案 1 :(得分:1)

通过WebResource.axd使用嵌入式资源是一个痛苦的问题,您可以从自己的答案中看到。你必须保持assemblyinfo.vb|cs同步,并且似乎总是几乎不可能得到所有名称空间和&大会名称就在所有正确的位置。

当你最终使它工作时,你的奖励是一个包含脚本行,看起来像核心内存转储。

我建议另类。给自己写一个非常简单的Web处理程序(例如MyResourceLoader.ashx。然后在你的类中添加一个方法,它只是以你认为有意义的方式提供它自己的嵌入式资源。你可以使用反射来获取类,比如WebResource ,或者只是将你需要的任何内容硬编码到你的加载器中,如果它只是用于特定目的。你班级中的公共方法可能如下所示:

public static Stream GetResource(string resourceName) {
   // get the resource from myself, which is easy and doesn't require 
   // anything in assemblyinfo, and return it as a stream. As a bonus, 
   // you can parse it dynamically or even return things that aren't
   // just embedded, but generated completely in code!
}

或者如果您决定制作更通用的东西,您可以使用类来获得所有想象并返回更多数据,例如

class ResourceInfo
{
    public Stream Data;
    public string MimeType;
    public string FileName;
}

现在,您可以以任何方式提供嵌入式资源,例如。

<script language="javascript" src="/MyResourceLoader.ashx/MyControlScript.js">

我认为MS弄乱了WebResource业务。幸运的是,它“非常直接做你自己的事情。”