问题很简单:如何在asp.net应用程序中使用嵌入式资源?在程序集中包括资源的步骤是什么,以及如何引用它?可能遇到的陷阱是什么?
编辑:对于没有引用Page和ClientScript的版本,请参见在Razor视图上处理嵌入式资源的正确方法是什么?
花了半天的时间,我学到了这些:
-
要嵌入资源,需要将构建操作设置为嵌入式资源(在VS解决方案资源管理器中右键单击文件->属性)
-
next assemblyinfo .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")%>)中有引用,则为该css的WebResource属性传递PerformSubstitution:=true。
- 名称由根命名空间/程序集名称+'.'+文件名组成。要100%确定名称,请使用以下代码片段进行查找:
-
引用资源可以用
Page.ClientScript.GetWebResourceUrl(GetType(MyWebResourceProj.ConssumingPage), "MyWebResourceProj.Test.css")
- 请注意,可以使用Me.GetType()代替GetType(Typename),但是,如果类是继承的,这将不起作用,所以要小心!
资源:
- 调试ASP。. NET 2.0 Web资源:解密URL并获取资源名
通过WebResource使用嵌入式资源。从你自己的回答中可以看出,这是一个令人头疼的问题。您必须保持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业务搞得一团糟。幸运的是,做你自己的事情很简单。