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)
В чем проблема?
Ответы
Ответ 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"
.