.NETアセンブリにテキストファイルを埋め込む方法は?


118

テキストファイルをアセンブリに埋め込んで、ディスクから読み取ることなくテキストを読み込めるようにし、必要なものがすべてexeファイルに含まれるようにしたいと考えています。(よりポータブルになるように)

これを行う方法はありますか?私はリソースファイルで何かを想定していますか?

そして可能であれば、どのようにそれを行い、どのようにプログラムでテキストを文字列にロードしますか?

回答:


147

プロジェクトファイルを右クリックし、[プロパティ]を選択します。

開いたウィンドウで[リソース]タブに移動し、タブページの中央に青いリンクがある場合は、それをクリックして新しいリソースを作成します。

ここに画像の説明を入力してください

次に、タブページの上のツールバーから、新しいテキストファイルを追加することを選択し、名前を付けます。プロジェクトに追加され、開かれます。

ここまで来たら、コードにResources.TheNameYouGaveTheTextFileHereと入力して、そのコンテンツにアクセスできます。クラスで初めてResourcesクラスを使用するときは、usingディレクティブを追加する必要があることに注意してください(Resourcesを入力してVSにメニューを表示させるには、Ctrl +を押してください)。

上記の説明について不明な点がある場合は、コメントを残してください。完了するか、意味がわかるまで編集します:)


1
「using」ディレクティブコードはどのように見えるでしょうか、私はこれを機能させるのに苦労しています。私はリソースとしてsolutions.txtを追加しましたが、Resources.solutionsを見つけることができません-usingディレクティブが欠落しているように感じます。
スペッジ09年

3
ああ、私がする必要があるのは、マイを追加することだけでした。前面に(つまりMy.Resources.solutions)シンプルに!
スペッジ09年

2
リソースを追加することで生成し、含まれProperties\Resources.Designer.csnamespace YourProjectRootNamespace.Properties、あなたが使用する必要がありますYourProjectRootNamespace.PropertiesProjectRootNamespaceVisualStudioのプロジェクトのプロパティで定義されます。
ilyaigpetrov 2014年

1
この方法でテキストファイルを追加し、そのテキストファイルが私のソリューションの一部であると言った場合...そのファイルが更新されてアセンブリを再構築すると、埋め込みリソースも更新されますか?または、ファイルを変更した場合、手動で削除/再追加する必要がありますか?
Peter Tirrell、2015

3
ファイルは、追加時ではなく、コンパイル時にリソースにパッケージ化されます。任意のツールでファイルを自由に変更して再構築できます。変更はアセンブリの一部になります。
Lasse V. Karlsen、2015

38

Visual Studio 2003、Visual Studio 2005、および場合によっては以前のバージョン(これは2008でも機能します)では、プロジェクトにテキストファイルを含め、[プロパティ]パネルでアクションを[埋め込みリソース]に設定できます。その後、を使用してストリームとしてファイルにアクセスできますAssembly.GetManifestResourceStream(string)

ここでの他の答えはより便利です。完全を期すためにこれを含めます。

このアプローチは、画像、アイコン、サウンドなどの他のタイプのファイルを埋め込むために機能することに注意してください...


8
注:GetManifestResourceStream()のパラメーターとして名前空間+ファイル名を使用します(例: "MyNamespace.MyTextfile.txt")。GetManifestResourceNames()を呼び出して、すべての名前のリストを取得することもできます。
Stiefel、2010

32

テキストファイルを埋め込んだ後、次のようなコードの任意の場所でそのファイルを使用します...

global::packageName.Properties.Resources.ThatFileName

3
これは、リソースが削除された場合にコンパイラエラーをスローするため、はるかに優れたアプローチです。また、タイプミスも排除されます。投稿ありがとうございます。
ベングリプカ

+5。C#DLLレベル内のファイルに書き戻すことはできますか?
Prajwal Bhat 2017

1
ThatFileName変数から指定したい場合はどうなりますか?
c00000fd 2018年

4

はい、あなたは正しいです-リソースファイルを作成します。文字列を「ロード」する必要がないことを実行すると、Resource.WhateverStringYouDefinedとして参照されます。


2

ここに私のために働いたものがあります。(実行可能な.NETイメージファイルに埋め込まれたファイルの内容を読み取る必要がありました。)

何かを行う前に、ファイルをVisual Studioのソリューションに含めます。(私の場合はVS 2017 Communityです。)に切り替えてからフォルダーをSolution Explorer右クリックし、ファイルをProperties選択Add Existing Itemしました。(と言いFileName.txtます。)次に、にいる間Solution Explorerに、含まれているファイルを右クリックし、を選択してPropertiesBuild Actionとして選択しますEmbedded Resource

次に、このコードを使用してそのバイトを読み取ります。

string strResourceName = "FileName.txt";

Assembly asm = Assembly.GetExecutingAssembly();
using( Stream rsrcStream = asm.GetManifestResourceStream(asm.GetName().Name + ".Properties." + strResourceName))
{
    using (StreamReader sRdr = new StreamReader(rsrcStream))
    {
        //For instance, gets it as text
        string strTxt = sRdr.ReadToEnd();
    }
}

この場合、承認された回答で提案されているように、そのファイルをリソースとして追加する必要ありません


1

これが私がしたことです:

  1. プロジェクトを右クリックしてVisual Studioにファイル(リソース)を追加しました。
  2. 追加したすべてのファイルを右クリックし、[ビルドタイプ]を埋め込みリソースに変更します。
  3. リソースにアクセスするには:

    a。関数を使用して現在のアセンブリを取得します。GetExecutingAssembly()

    b。追加したリソースはテキストファイルだったので、次のコマンドを使用してストリームに読み込みました。GetManifestResourceStream(fileName)。私がファイル名にアクセスする方法は、GetManifestResourceNames()

    c。必要な場合は、StreamReader()クラスを使用してファイルの終わりまで変数に読み込みます。


0

現在のアセンブリを取得するには、Pavanの回答に追加します(一般的なセクション):

Assembly _assembly;

GetManifestResourceStream(fileName)(リソースからの読み取りが必要なコード内):

try
{
    _assembly = Assembly.GetExecutingAssembly();
    _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("*Namespace*.*FileName*.txt"));
}
catch
{
    Console.WritelLine("Error accessing resource!");
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.