【问题标题】:Why does GetManifestResourceStream returns null (with dotnet core)为什么 GetManifestResourceStream 返回 null(使用 dotnet core)
【发布时间】:2020-03-15 13:55:43
【问题描述】:

使用 dotnet core:.NET Core SDK 版本:3.1.102

为什么下面的返回null
?

typeof(MyClassName).GetTypeInfo().Assembly.GetManifestResourceStream("MyFile.cs")

我验证了该文件存在于解决方案中,并且在属性“Embedded Resource”中具有构建操作

【问题讨论】:

    标签: c# .net .net-core reflection .net-assembly


    【解决方案1】:

    您可以检查哪些资源名称可用:

    string[] names = this.GetType().Assembly.GetManifestResourceNames();
    

    如果资源存在,则写入正确的资源名称

    【讨论】:

    • 好的 - 我这样做了 - names 不包含我感兴趣的名字 - 那么我现在该怎么办?
    • 即使我尝试使用名称列表中的 现有 名称之一,我也会得到 null - 有什么想法吗?
    • @Danielle 您是否尝试将该文件的构建操作设置为Embedded Resource
    • 好的 - 无法解释这一点 - 但是 - 名称列表中的一个名称实际上是我正在寻找的文件中的 first 类(“MyFile.cs ") - 并且使用这个类名而不是的文件名实际上有效
    【解决方案2】:

    文件名必须包含程序集的“根命名空间”,例如“My.Namespace.MyFile.cs”。通常是程序集的名称,但可以在 .csproj 文件中更改。

    【讨论】:

    • 感谢您的回答 - 但真正让我明白发生了什么事情的是打印出名称列表 - 正如所选答案中所建议的那样:) 因为我使用的文件名已经 with 你在这里指出的根命名空间,所以这对我没有多大帮助
    【解决方案3】:

    加载嵌入资源程序集,遍历GetManifestResourceNames以找到完全限定的资源名称,然后将其用于GetManifestResourceStream em>。

    你可以试试

    var assembly = Assembly.LoadFrom(Assembly.GetAssembly(typeof(MainWindow)).Location);
    string[] names = assembly.GetManifestResourceNames();
    var stream = assembly.GetManifestResourceStream(names[0]);
    

    【讨论】:

    • 此方法已在另一个答案中进行了说明,不适用于 OP
    【解决方案4】:

    只是对 .NET 5 的更新。以下是帮助我找到资源名称以帮助解决我在 .NET 5 中的问题的原因:

    string[] names = Assembly.GetCallingAssembly().GetManifestResourceNames();
    
                    foreach (var name in names)
                    {
                        Console.WriteLine(name);
                    }
    

    【讨论】:

      猜你喜欢
      • 2014-03-05
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 1970-01-01
      • 2022-12-26
      • 2016-12-28
      相关资源
      最近更新 更多