web-dev-qa-db-ja.com

GetManifestResourceStream()を使用して埋め込みリソースを傾斜できない

/ linkres:コンパイラー引数を使用してバイナリファイルを埋め込みますが、それをロードしようとすると:

System.Reflection.Assembly myAssembly = System.Reflection.Assembly.GetExecutingAssembly();
string[] names = myAssembly.GetManifestResourceNames(); // it is really there by its name "shader.tkb"
Stream myStream = myAssembly.GetManifestResourceStream( names[0] );

これは

 Unhandled Exception: System.IO.FileNotFoundException: Could not load file or Assembly 'shader.tkb' or one of its dependencies. The system cannot find the file specified. ---> System.IO.FileNotFoundException: The system cannot find the file specified. (Exception from HRESULT: 0x80070002)
--- End of inner exception stack trace ---
at System.Reflection.RuntimeAssembly.GetResource(RuntimeAssembly Assembly, String resourceName, UInt64& length, StackCrawlMarkHandle stackMark, Boolean skipSecurityCheck)
at System.Reflection.RuntimeAssembly.GetManifestResourceStream(String name, StackCrawlMark& stackMark, Boolean skipSecurityCheck)
at System.Reflection.RuntimeAssembly.GetManifestResourceStream(String name)

ここの問題は何ですか?

18
clamp

1-ファイルのビルドアクションは埋め込みリソースである必要があります。
2-リソース名だけを指定することはできません。リソース名の前にアセンブリ名全体を指定する必要があります

Assembly assembly = this.GetType().Assembly;
Assembly.GetManifestResourceStream(
    Assembly.GetName().Name + "." + "SubFolderNameIfAny" + ".shader.tkb");
36
Aseem Gautam

プロジェクトnamespaceを考慮する必要があるかもしれません:

私のために働いたのは:

System.Reflection.Assembly assem = this.GetType().Assembly;         
using( Stream stream = assem.GetManifestResourceStream("Project_A.FolderName.test.txt") )   

ここで、「Project_A」は私のプロジェクトでしたnamespace
プロジェクトのソリューションエクスプローラーで「FolderName」がfolderであるところ。
「test.txt」は、「FolderName」フォルダー内の埋め込みリソースです。

私が使用した場合:

assem.GetName().Name

「Project_A」ではなく「Project A」を取得しますか?!?!?!?

2
AORD

このリンク は、埋め込みリソースの使用方法を理解するのに役立ちます。 Aseemが提供するソリューションは、プロジェクトのプロパティの[アプリケーション]タブで説明されているように、アセンブリ名がプロジェクトのデフォルトの名前空間と同じ場合にのみ機能します。

(アセンブリ名がプロジェクトのデフォルトの名前空間と同じでなくても)何をする必要があるかは次のとおりです。

using System.IO;
using System.Reflection;

Assembly myAssembly = Assembly.GetExecutingAssembly();
Stream myStream = Assembly.GetManifestResourceStream(fullResourceName);

ここで、fullResourceNameは、アクセスする埋め込みリソースの完全修飾名です。

リソースの場合(ここでshader.tkb)はプロジェクトのルートフォルダにあり、次にfullResourceName = "Default.Namespace.Of.Project.shader.tkb"。リソースがプロジェクトフォルダーにあるResourcesというフォルダー内にある場合、fullResourceName = "Default.Namespace.Of.Project.Resources.shader.tkb"

1
Suhas Pai

AssemblyオブジェクトでGetManifestResourceNames()を使用して、ファイル(およびその名前)のリスト全体を取得できます。

理由はわかりませんが、私のプロジェクトではサブフォルダー名を含めるべきではありません。アセンブリのベース名とファイル名のみ。

1
Marco Guignard