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

MsB*_*ler 49 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()null加载时返回site_export.master.
  4. 我打电话GetManifestResourceNames()来检查site_export.masterDLL中是否存在它确实存在.它在列表中.所有名称空间都匹配.我没有在这里列出名称空间.

为什么不能GetManifestResourceStream()加载我的新site_export.master?它装site.master得很好.我知道我的DLL已加载,因为我可以看到DLL中的其他文件.

Sha*_*dat 86

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

第1步.构建动作设置为嵌入式资源请参阅

C#的GetManifestResourceStream Gotcha

第2步.使用namespace.resourcename请参阅GetManifestResourceStream()返回null?

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

  • 哈哈......嵌入式资源......非常感谢,节省了很多时间:) (4认同)
  • 要提到的是,在项目属性页面中定义了默认命名空间.这是要使用的命名空间. (3认同)
  • 非常有用,谢谢!第2步为我解决了. (2认同)
  • 如果图像在子文件夹中,请使用`namespace.subfolder.resourcename`。 (2认同)

Yur*_*ula 72

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

string[] names = assembly.GetManifestResourceNames();
Run Code Online (Sandbox Code Playgroud)

(就我而言,我误用了另一个程序集中的命名空间)

  • 这帮我找到了问题; 谢谢 :) (3认同)
  • 在简单的情况下,在调试时将其粘贴到“立即窗口”中:`Assembly.GetExecutingAssembly()。GetManifestResourceNames();` (2认同)

小智 9

我这样做是为了让它工作:

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

第2步:更改源代码,如下所示:

Assembly _assembly;
  _assembly = Assembly.GetExecutingAssembly();         
  xslStream = _assembly.GetManifestResourceStream("CRDFXSL");
  _xmlReader = XmlReader.Create(xslStream);
Run Code Online (Sandbox Code Playgroud)

因此一切都变得微不足道..