【问题标题】:Why does GetManifestResourceStream returns null while the resource name exists when calling GetManifestResourceNames?为什么调用GetManifestResourceNames时资源名存在时GetManifestResourceStream返回null?
【发布时间】:2016-10-21 15:07:25
【问题描述】:

我有一个 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. 当我加载 site_export.master 时,GetManifestResourceStream() 返回 null
  4. 我调用GetManifestResourceNames() 来检查site_export.master 是否存在于DLL 中并且确实存在。它在列表中。所有名称空间都匹配。我没有在这里列出命名空间。

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

【问题讨论】:

标签: c# asp.net


【解决方案1】:

记住以下问题...

第 1 步。构建操作集到嵌入式资源请参阅

C#’s GetManifestResourceStream Gotcha

第 2 步。使用namespace.resourcenameGetManifestResourceStream() returns null ?

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

【讨论】:

  • 哈哈...嵌入式资源...非常感谢,节省了很多时间:)
  • 提到在项目属性页面中定义了默认命名空间。这是要使用的命名空间。
  • 如果图片在子文件夹中,使用namespace.subfolder.resourcename
  • 这篇文章解释了如何执行上述解决方案的第 1 步(将 Build Action 设置为 'Embedded resource')stackoverflow.com/questions/10587875/…
【解决方案2】:

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

string[] names = assembly.GetManifestResourceNames();

(在我的例子中,我滥用了来自另一个程序集的命名空间)

【讨论】:

  • 在简单的情况下,在调试时将其粘贴到“立即窗口”:Assembly.GetExecutingAssembly().GetManifestResourceNames();
  • @JuhaPalomäki,它可能会有所帮助,但并非在所有情况下(因此您会收到类似“评估需要所有线程运行”之类的信息),尤其是在 VS2017 中。
  • 当您遇到异常并在调试时运行它时很棒:)
  • 如果它在即时窗口中不起作用,您可以检查您在代码中设置的变量:var dudes = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();跨度>
  • 谢谢。问题是资源路径错误。
【解决方案3】:

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

步骤 1: 选择资源(在我的例子中为 CRDF.xsl)并右键单击 > 属性。 将 Build Action 设置为“EmbeddedResource”,将 Logical Name 设置为您选择的名称,例如CRDFXSL。

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

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

所以一切都很顺利..

【讨论】:

  • 要补充一点 - 您可能需要在 *.csproj 文件 manually 中设置 <LogicalName>
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    试试这个:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      • 2013-01-02
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      • 2014-12-20
      • 2015-03-08
      相关资源
      最近更新 更多