web-dev-qa-db-ja.com

ストリームとしてのアセンブリからのリソース

ビルドアクションが「リソース」に設定されているC#WPFアプリに画像があります。これは単なるソースディレクトリ内のファイルであり、ドラッグ/ドロッププロパティダイアログを介してアプリのリソースコレクションに追加されていません。ストリームとして書き込もうとしていますが、ドット、スラッシュ、ネームスペースなど、さまざまなバリエーションを試しても、開けません。

「pack:// application:,/Resources/images/flags/tr.png」を使用して、xamlの別の場所で使用するためにアクセスできますが、それを含むストリームにアクセスできません。

ほとんどの場所で使用と表示されているようです

using(BinaryReader reader = new BinaryReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("ResourceBlenderExpress.Resources.images.flags.tr.png"))) {
    using(BinaryWriter writer = new BinaryWriter(File.OpenWrite(imageFile))) {
        while((read = reader.Read(buffer, 0, buffer.Length)) > 0) {
            writer.Write(buffer, 0, read);
        }
        writer.Close();
    }
    reader.Close();
}

私には運がありませんでした。

30
Echilon

GetManifestResourceStreamは、従来の.NETリソース、つまりRESXファイルで参照されるリソース用です。これらは、WPFリソースとは異なります。つまり、Resourceのビルドアクションで追加されたリソースです。これらにアクセスするには、 Application.GetResourceStream を使用して、適切なpack:URIを渡します。これは、リソースのデータにアクセスするためのStreamプロパティを持つStreamResourceInfoオブジェクトを返します。

25
Phil Devaney

あなたはおそらく探しています Application.GetResourceStream

StreamResourceInfo sri = Application.GetResourceStream(new Uri("Images/foo.png"));
if (sri != null)
{
    using (Stream s = sri.Stream)
    {
        // Do something with the stream...
    }
}
26
Thomas Levesque

私が正しいとしたら、正確な名前がわからないので、リソースストリームを開くのに問題がありますか?もしそうなら、あなたは使うことができます

System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames()

含まれているすべてのリソースの名前のリストを取得します。この方法で、イメージに割り当てられたリソース名を見つけることができます。

6
Frank Bollack

Close()メソッドを呼び出す必要はありません。using句の最後でDispose()によって自動的に呼び出されます。したがって、コードは次のようになります。

using(BinaryReader reader = new BinaryReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("ResourceBlenderExpress.Resources.images.flags.tr.png")))
using(BinaryWriter writer = new BinaryWriter(File.OpenWrite(imageFile))) 
{
    while((read = reader.Read(buffer, 0, buffer.Length)) > 0) 
    {
        writer.Write(buffer, 0, read);
    }
}
1
Darin Dimitrov