2011-04-21 40 views

回答

5

花了一天半后,我已经学会了这些:(在VS

  1. 嵌入一个需要设置它的生成操作嵌入的资源资源解决方案资源管理器中右击该文件 - >属性)

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

    • 该名称由根名称空间/程序集名称+'。'+文件名组成。可以肯定的名称的100%,使用下面的代码片段来关注一下吧:
      Dim resNames = Assembly.LoadFile("YourDll.dll").GetManifestResourceNames()
    • 需要注意的是,大会的根命名空间必须是一样的大会名称(这个我花了大约4个小时实现。至少在.Net v4的情况下)
    • 如果在CSS中有引用(<%= WebResource(“NS.image.jpg”)%>)比传递PerformSubstitution:= true为该CSS的WebResource属性。
  3. 引用的资源可以用Page.ClientScript.GetWebResourceUrl(GetType(MyWebResourceProj.ConssumingPage), "MyWebResourceProj.Test.css")

    • 注意,代替的GetType(类型名)一个可以使用Me.GetType(),但同样,如果类是行不通完成继承,所以要小心!

资源:

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">

我认为微软提出,WebResource业务的一个烂摊子。幸运的是,它非常简单地做你自己的事情。

+0

但是MS方法更安全。 – jaraics 2011-04-22 05:56:55

+0

为什么MS方法更安全?你认为这种方法存在什么样的安全风险? – 2011-04-22 11:52:37

+0

通过此解决方案,程序集中嵌入的所有资源都是可请求的,另一种方法可以仅标记一些可访问的资源 – jaraics 2011-04-24 10:53:51