在调用GetManifestResourceNames时,为什么GetManifestResourceStream在资源名称存在时返回null?

时间:2012-05-23 19:51:05

标签: c# asp.net

我有一个Web应用程序项目。我生成了DLL并将其导入另一个项目。我实施了VirtualPathProvider

我关注了这个网站:http://support.microsoft.com/kb/910441/en-us?spid=8940&sid=global,一切正常,直到我添加另一个网站管理员。

  1. 我添加了site_export.master并将其Build Action更改为Embedded Resource。
  2. 我改变了我的页面以使用新的网站管理员。
  3. 当我加载GetManifestResourceStream()时,
  4. null会返回site_export.master
  5. 我调用GetManifestResourceNames()来检查DLL中是否存在site_export.master。它在列表中。所有名称空间都匹配。我没有在这里列出名称空间。
  6. 为什么GetManifestResourceStream()无法加载我的新site_export.master?它加载site.master就好了。我知道我的DLL已加载,因为我可以看到DLL中的其他文件。

5 个答案:

答案 0 :(得分:84)

请记住以下问题......

第1步。构建设置为嵌入资源的操作,请参阅

C#’s GetManifestResourceStream Gotcha

第2步。使用namespace.resourcename,请参阅GetManifestResourceStream() returns null ?

实际上,如果访问另一个程序集中的私有资源并且调用者没有带ReflectionPermission标记的ReflectionPermissionFlag.MemberAccess,则此方法返回null。

答案 1 :(得分:65)

侧面提示。确保您使用正确的名称并使用正确的名称:转储并评估目标程序集中可用的所有资源

string[] names = assembly.GetManifestResourceNames();

(在我的情况下,我误用了另一个程序集中的命名空间)

答案 2 :(得分:7)

我这样做是为了让它发挥作用:

第1步:选择资源(在我的情况下为CRDF.xsl),然后右键单击>属性。 将Build Action设置为" EmbeddedResource"和逻辑名称到您选择的名称,例如CRDFXSL。

第2步:更改您的源代码:

Assembly _assembly;
  _assembly = Assembly.GetExecutingAssembly();         
  xslStream = _assembly.GetManifestResourceStream("CRDFXSL");
  _xmlReader = XmlReader.Create(xslStream);

因此一切都变得很糟糕......

答案 3 :(得分:2)

提示和注意: 如果"汇编名称"和"默认命名空间"在项目文件中不匹配,那么GetManifestResourceStream也将返回null。 GetManifestResourceNames仍然返回程序集的名称,但在加载期间清单不起作用。

答案 4 :(得分:0)

试试这个:

Dim ctx As Windows.ApplicationModel.Resources.Core.ResourceContext = New Windows.ApplicationModel.Resources.Core.ResourceContext()
ctx.Languages = {Globalization.CultureInfo.CurrentUICulture.Name}
Dim rmap As Windows.ApplicationModel.Resources.Core.ResourceMap = Windows.ApplicationModel.Resources.Core.ResourceManager.Current.MainResourceMap
Dim res = rmap.GetValue("Assets/sample.png", ctx)
Dim resFile = Await res.GetValueAsFileAsync

Windows.ApplicationModel.Resources.Core.ResourceManager.Current.MainResourceMap列出所有资源。