c# - poner - No se puede cargar el recurso incrustado con GetManifestResourceStream()
poner sonido a un boton en c# (4)
1 - La acción de compilación del archivo debe ser un recurso incrustado.
2 - No puedes simplemente especificar el nombre del recurso. Debe especificar el nombre completo del ensamblaje antes del nombre del recurso
Assembly assembly = this.GetType().Assembly;
assembly.GetManifestResourceStream(
assembly.GetName().Name + "." + "SubFolderNameIfAny" + ".shader.tkb");
Estoy incrustando un archivo binario con el argumento / linkres: compiler, pero cuando intento cargarlo con:
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] );
esto lleva a un
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)
¿Cuál es el problema aquí?
El espacio de nombres del proyecto puede ser necesario tener en cuenta:
Lo que funcionó para mí fue:
System.Reflection.Assembly assem = this.GetType().Assembly;
using( Stream stream = assem.GetManifestResourceStream("Project_A.FolderName.test.txt") )
Donde "Project_A" era el espacio de nombres de mis proyectos.
Donde "FolderName" es una carpeta en mis proyectos Explorador de soluciones.
Donde "test.txt" es un recurso incrustado en la carpeta "FolderName".
Si yo use
assem.GetName().Name
Obtendría "Proyecto A" en lugar de "Proyecto_A"?!?!?!?
Puede usar GetManifestResourceNames () en su objeto Assembly para obtener la lista completa de archivos (y su nombre).
No sé por qué, pero en mi proyecto no debería incluir el nombre de la subcarpeta. Solo el nombre base del ensamblaje con el nombre de archivo.
Este enlace le ayudará a entender cómo usar los recursos incrustados. La solución dada por Aseem funciona solo si el nombre del ensamblaje es el mismo que el espacio de nombres predeterminado del proyecto, como se menciona en la pestaña ''Aplicación'' de las propiedades del proyecto.
Lo que se debe hacer (incluso si el nombre del ensamblaje no es el mismo que el espacio de nombres predeterminado del proyecto) es:
using System.IO;
using System.Reflection;
Assembly myAssembly = Assembly.GetExecutingAssembly();
Stream myStream = assembly.GetManifestResourceStream(fullResourceName);
donde fullResourceName
es el nombre completo del recurso incorporado al que desea acceder.
Si el recurso (aquí shader.tkb
) está en la carpeta raíz del proyecto, fullResourceName = "Default.Namespace.Of.Project.shader.tkb"
. Si el recurso está presente dentro de una carpeta llamada Resources
ubicada en la carpeta de su proyecto, entonces fullResourceName = "Default.Namespace.Of.Project.Resources.shader.tkb"
.