wake-up-neo.com

GetManifestResourceStream gibt NULL zurück

Dies ist eine C # .NET 4.0-Anwendung:

Ich binde eine Textdatei als Ressource ein und versuche dann, sie in einem Dialogfeld anzuzeigen:

    var Assembly = Assembly.GetExecutingAssembly();
    var resourceName = "MyProj.Help.txt";

        using (Stream stream = Assembly.GetManifestResourceStream(resourceName))
        {
            using (StreamReader reader = new StreamReader(stream))
            {
                string result = reader.ReadToEnd();
                System.Windows.Forms.MessageBox.Show(result, "MyProj", MessageBoxButtons.OK);
            }
        }

Die Lösung ist MyProjSolution und die ausführbare Datei ist MyProj.exe. Help.txt ist eine eingebettete Ressource. Der Stream ist jedoch null. Ich habe MyProjSolution.Help.txt und MyProjSolution.MyProj.Help.txt ausprobiert, aber nichts scheint zu funktionieren.

58
Ron

Sie können mit überprüfen, ob die Ressourcen korrekt eingebettet sind 

//From the Assembly where this code lives!
this.GetType().Assembly.GetManifestResourceNames()

//or from the entry point to the application - there is a difference!
Assembly.GetExecutingAssembly().GetManifestResourceNames()

beim debuggen. Dadurch werden alle (vollständig qualifizierten Namen) aller in der Assembly eingebetteten Ressourcen aufgelistet, in die Ihr Code geschrieben ist.

Siehe Assembly.GetManifestResourceNames () auf MSDN.

Kopieren Sie einfach den entsprechenden Namen und verwenden Sie diesen anstelle des in der Variablen 'Ressourcenname' definierten Namens. 

Hinweise - Bei dem Ressourcennamen wird die Groß- und Kleinschreibung beachtet. Wenn Sie die Ressourcendatei falsch eingebettet haben, wird sie nicht in der Liste angezeigt, die vom Aufruf von GetManifestResourceNames () zurückgegeben wird. Stellen Sie außerdem sicher, dass Sie die Ressource aus der richtigen Assembly lesen (wenn mehrere Assemblys verwendet werden). Es ist einfach, die Ressourcen von der aktuell ausgeführten Assembly abzurufen, anstatt von einer referenzierten Assembly.

EDIT - .NET Core
Weitere Informationen zum Einbetten von .NET Core finden Sie in diesem SO post

Das Abrufen der Manifest-Informationen sieht ähnlich aus - verwenden Sie einfach this.GetType().GetTypeInfo().Assembly.GetManifestResourceNames(), um ein Manifest aus der Assembly zu erhalten, in der der Code ausgeführt wird.

Ich habe noch nicht herausgefunden, wie man das Äquivalent von Assembly.GetExecutingAssembly() in .NET Core macht! Wenn jemand weiß, lass es mich wissen und ich werde diese Antwort aktualisieren.

130
Jay

Ich hatte bei einem ähnlichen Problem zuerst überprüft, ob die Datei in Ihrem Projekt enthalten ist. Dann gehen Sie zu Eigenschaften und legen Sie die Build-Aktion dieser Datei auf Embedded Resource fest. das hat für mich funktioniert. 

43
Jithesh Chandra

Nur eine Warnung. 

Ich konnte auf meine Datei nicht als eingebettete Ressource zugreifen, obwohl ich dies angegeben hatte und obwohl diese Build-Action-Eigenschaft vorhanden war. Ich habe viel Zeit verschwendet und meinen Kopf geschlagen. Ich habe eine Csharp-Codedatei eingebettet, in deren Dateiname .txt (xxx.cs.txt) eingefügt wurde. Aus irgendeinem Grund sehen die Methoden GetManifestResourceNames () und GetManifestResourceStream () keine Datei mit dem Namen .cs im Namen.

Ich habe es einfach in xxx.txt umbenannt und alles war in Ordnung.

Seltsam.

6
Belmiris

Hier ist die Ursache meines Nullwerts.

http://adrianmejia.com/blog/2011/07/18/cs-getmanifestresourcest-gotcha/

Die GetManifestResourceStream-Methode gibt immer NULL zurück, wenn die Eigenschaft "Built-Action" der Ressource nicht auf "Embedded Resource" gesetzt ist.

Nach dem Festlegen dieser Eigenschaft mit allen erforderlichen Dateien gibt Assembly.GetManifestResourceStream den entsprechenden Stream anstelle von NULL zurück

6
Nate

Die "Build Action" -Eigenschaft der eingebetteten Datei sollte als "Embedded Resource" festgelegt werden, um die unten angegebene Zeile ordnungsgemäß auszuführen:

Stream stream = Assembly.GetManifestResourceStream(resourceName)

Klicken Sie mit der rechten Maustaste auf die Datei, klicken Sie auf die Eigenschaft und legen Sie die Eigenschaft "Build Action" als "Embedded Resource" fest:

 enter image description here 

2
Ozlu

Ich hatte das gleiche Problem, dank Jay fand ich, dass es einen Bindestrich im Verzeichnisnamen gab.

ProjectName.ResourceFolder.Sub-Directory wird ProjectName.ResourceFolder.Sub_Directory, wenn Sie auf den Ressourcenstrom verweisen.

1
Aaron

Sie müssen Ihre Lösung entladen. Dann bearbeiten Sie das Projekt. Nach dem Finden Ihres Ordners und ändern Sie es wie folgt:

<EmbeddedResource Include="yourpath" />
0
Tiga
    First Unload the project and click on edit the project file. 

    Inside the project file make sure that the item you are fetching from the Assembly is included inside <EmbeddedResource> tag.

    Eg: 

         <ItemGroup>
          <EmbeddedResource Include="Template\ForExampleFile.html" />
         </ItemGroup>


    The files I added into the project were just in Content tag but not in the EmbeddedResource as shown below by default. Hence the stream was returning null.
    <ItemGroup>
        <Content Include="Template\ForExampleFile.html" />
  </ItemGroup>
0
Geek

In meinem Fall bestand das Problem darin, dass der Code, der nach der Ressource sucht, sich in einem anderen Projekt befand als die Ressource selbst.

Sie können nur auf Ressourcen zugreifen, die sich in demselben Projekt befinden, in dem sich der Code befindet. Ich dachte, ich könnte alle meine Ressourcen in das Webseitenprojekt stecken, aber ich brauche auch Bilder in dem Mailprojekt.

Ich hoffe, das hilft jemandem in der gleichen Situation, in der ich war.

Ich finde es sehr nützlich, Assembly.GetExecutingAssembly().GetManifestResourceNames(); zu nennen.

0
AxelWass