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

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

我遵循这个网站: http : //support.microsoft.com/kb/910441/en-us?spid=8940&sid=global ,一切正常,直到我添加另一个网站的主人。

  1. 我添加了site_export.master ,并将其构build操作更改为embedded式资源。
  2. 我改变了我的网页使用新的网站主。
  3. 当我加载site_export.master时, GetManifestResourceStream()返回null
  4. 我调用GetManifestResourceNames()来检查在DLL中是否存在site_export.master并且它确实存在。 在列表中。 所有的名字空间都匹配。 我没有在这里列出名字空间。

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

请记住以下问题

第1步 。 build立行动设置为embedded式资源见

C#的GetManifestResourceStream问题

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

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

侧面提示。 为了确保你在正确的组装和正确的名称:转储和评估目标程序集中的所有可用资源

 string[] names = assembly.GetManifestResourceNames(); 

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

我这样做,使其工作:

步骤1:select资源(在我的情况下是CRDF.xsl),然后右键单击>属性。 将生成操作设置为“EmbeddedResource”和逻辑名称作为您select的名称,例如CRDFXSL。

第2步:像这样更改您的源代码:

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

因此,一切都变得smoooooooth ..

提示和警告:如果“程序集名称”和“默认名称空间”在项目文件中不匹配,那么GetManifestResourceStream也会返回null。 GetManifestResourceNames仍然返回程序集的名称,但在加载清单不起作用。

尝试这个:

 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列出所有资源。