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