Cant загружает встроенный ресурс с помощью GetManifestResourceStream() - программирование
Подтвердить что ты не робот

Cant загружает встроенный ресурс с помощью GetManifestResourceStream()

Я встраиваю двоичный файл с аргументом /linkres: compiler, но когда я пытаюсь загрузить его с помощью

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

это приводит к a

 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)

В чем проблема?

4b9b3361

Ответ 1

1 - Действие по созданию файла должно быть встроенным ресурсом.
2 - Вы не можете просто указать имя ресурса. Вы должны указать имя всей сборки перед именем ресурса

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

Ответ 2

Может потребоваться учитывать проект пространство имен:

Что для меня работало:

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

Где "Project_A" - это мои проекты пространство имен.
Где "FolderName" - это папка в моих проектах Solution Explorer.
Где "test.txt" является встроенным ресурсом в папке "FolderName".

Если я использовал:

assem.GetName().Name

Я бы получил "Project A" вместо "Project_A"?!?!?!?

Ответ 3

Вы можете использовать GetManifestResourceNames() для объекта Assembly, чтобы получить весь список файлов (и их имя).

Я не знаю, почему, но в моем проекте я не должен включать имя подпапки. Просто базовое имя сборки с именем файла.

Ответ 4

Эта ссылка поможет вам понять, как использовать встроенные ресурсы. Решение, данное 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".