web-dev-qa-db-ja.com

GetManifestResourceStreamはNULLを返します

これはC#.NET 4.0アプリケーションです。

テキストファイルをリソースとして埋め込み、ダイアログボックスに表示しようとしています。

    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);
            }
        }

ソリューションはMyProjSolutionで、実行可能ファイルはMyProj.exeです。 Help.txtは埋め込みリソースです。ただし、ストリームはnullです。 MyProjSolution.Help.txtとMyProjSolution.MyProj.Help.txtを試しましたが、何も機能しないようです。

74
Ron

を使用して、リソースが正しく埋め込まれていることを確認できます

//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()

デバッグするとき。これにより、コードが記述されているアセンブリに埋め込まれたすべてのリソースのすべて(完全修飾名)がリストされます。

MSDNの Assembly.GetManifestResourceNames() を参照してください。

関連する名前をコピーし、変数「resourceName」で定義した名前の代わりにそれを使用します。

注-リソース名は大文字と小文字が区別され、リソースファイルを誤って埋め込んだ場合、GetManifestResourceNames()の呼び出しによって返されるリストには表示されません。また、正しいアセンブリからリソースを読んでいることを確認してください(複数のアセンブリが使用されている場合)-参照されているアセンブリからではなく、現在実行中のアセンブリからリソースを簡単に取得できます。

EDIT-.NET Core
。NET Coreを使用して埋め込む方法の詳細については、こちらをご覧ください SO post .

マニフェスト情報の取得も同様に見えます-this.GetType().GetTypeInfo().Assembly.GetManifestResourceNames()を使用して、コードが実行されているアセンブリからマニフェストを取得してください。

.NET CoreでAssembly.GetExecutingAssembly()に相当する方法をまだ理解していません。誰でも知っている場合-私に知らせてください、私はこの答えを更新します。

150
Jay

ファイルがプロジェクトに含まれていることを最初に確認した後、プロパティに移動し、そのファイルのビルドアクションをEmbedded Resourceに設定します。これは私のために働いた。

52
Jithesh Chandra

Null値の原因は次のとおりです。

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

リソースの「built action」プロパティが「embedded resource」に設定されていない場合、GetManifestResourceStreamメソッドは常にNULLを返します。

必要なすべてのファイルでこのプロパティを設定した後、Assembly.GetManifestResourceStreamはNULLではなくcorrentストリームを返し始めます

9
Nate

ただの警告。

ビルドアクションプロパティが指定されていても、埋め込みアクションとしてファイルにアクセスできませんでした。私の頭を叩いて多くの時間を無駄にしました。名前に.txtを追加したcsharpコードファイル(xxx.cs.txt)を埋め込みました。何らかの理由で、GetManifestResourceNames()およびGetManifestResourceStream()メソッドは、名前に.csが含まれるファイルを認識しません。

単にxxx.txtという名前に変更しましたが、すべて問題ありませんでした。

奇妙な。

6
Belmiris

埋め込みファイルの "ビルドアクション"プロパティは "Embedded Resource"以下に示す行を適切に実行します。

Stream stream = Assembly.GetManifestResourceStream(resourceName)

ファイルを右クリックしてプロパティをクリックし、「ビルドアクション」プロパティを「埋め込みリソース」として設定します。

enter image description here

3
Ozlu

私は同じ問題を抱えていました。ジェイのおかげで、ディレクトリ名にハイフンが含まれていることがわかりました。

リソースストリームを参照すると、ProjectName.ResourceFolder.Sub-DirectoryProjectName.ResourceFolder.Sub_Directoryになります。

2
Aaron

ソリューションをアンロードする必要があります。次に、プロジェクトを編集します。フォルダを見つけて、次のように変更します。

<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

私の場合、問題は、リソースを探しているコードがリソース自体とは異なるプロジェクトにあることでした。

コードと同じプロジェクトにあるリソースにのみアクセスできます。すべてのリソースをWebページプロジェクトに入れることができると思いましたが、メールプロジェクトにも画像が必要です。

これが私と同じ状況で誰かを助けることを願っています。

Assembly.GetExecutingAssembly().GetManifestResourceNames();を呼び出すと本当に便利だと思います。

0
AxelWass