Esta es una aplicación C # .NET 4.0:
Estoy incrustando un archivo de texto como recurso y luego intento mostrarlo en un cuadro de diálogo:
var assembly = Assembly.GetExecutingAssembly();
var resourceName = "MyProj.Help.txt";
using (Stream stream = assembly.GetManifestResourceStream(resourceName))
{
using (StreamReader reader = new StreamReader(stream))
{
string result = reader.ReadToEnd();
System.Windows.Forms.MessageBox.Show(result, "MyProj", MessageBoxButtons.OK);
}
}
La solución es MyProjSolution y el ejecutable es MyProj.exe. Help.txt es un recurso integrado. Sin embargo, la secuencia es nula. Probé MyProjSolution.Help.txt y MyProjSolution.MyProj.Help.txt pero nada parece funcionar.
Respuestas:
Puede comprobar que los recursos están incrustados correctamente utilizando
al depurar. Esto enumerará todos los (nombres completos) de todos los recursos incrustados en el ensamblado en el que está escrito su código.
Vea Assembly.GetManifestResourceNames () en MSDN.
Simplemente copie el nombre relevante y utilícelo en lugar de lo que haya definido en la variable 'resourceName'.
Notas: el nombre del recurso distingue entre mayúsculas y minúsculas, y si ha incrustado incorrectamente el archivo de recursos, no aparecerá en la lista devuelta por la llamada a GetManifestResourceNames (). Además, asegúrese de leer el recurso del ensamblado correcto (si se utilizan varios ensamblados); es muy fácil obtener los recursos del ensamblado que se está ejecutando actualmente en lugar de un ensamblado referenciado.
EDITAR: .NET Core
Consulte esta publicación de SO para obtener detalles sobre cómo incrustar usando .NET Core.
Recuperar la información del manifiesto parece ser similar; solo utilícelo
this.GetType().GetTypeInfo().Assembly.GetManifestResourceNames()
para obtener el manifiesto del ensamblado donde se está ejecutando el código.¡Todavía no he descubierto cómo hacer el equivalente
Assembly.GetExecutingAssembly()
en .NET Core! si alguien lo sabe, hágamelo saber y actualizaré esta respuesta.fuente
Tuve un problema similar, verifique primero que el archivo esté incluido en su proyecto, luego vaya a propiedades y establezca la acción de compilación de ese archivo en Recurso incrustado. esto funcionó para mí.
fuente
DefatultNameSpace.Infrastructure.Help.txt
. Espacio de nombre predeterminado en la página de propiedades de su proyecto yInfrastructure
sería la carpeta en la que se encuentra el archivoLa propiedad "Acción de compilación" del archivo incrustado debe establecerse como "Recurso incrustado" para ejecutar la línea, que se muestra a continuación, correctamente:
Haga clic derecho en el archivo, haga clic en la propiedad y luego establezca la propiedad "Acción de compilación" como "Recurso incrustado":
fuente
Aquí está la causa de mi valor nulo.
http://adrianmejia.com/blog/2011/07/18/cs-getmanifestresourcestream-gotcha/
El
GetManifestResourceStream
método siempre devolveráNULL
si la propiedad 'acción construida' del recurso no está establecida en 'recurso incrustado'Después de establecer esta propiedad con todos los archivos necesarios,
assembly.GetManifestResourceStream
comienza a devolver la secuencia correcta en lugar deNULL
.fuente
Sólo una advertencia.
No pude acceder a mi archivo como recurso incrustado aunque especifiqué que lo era y aunque tenía esa propiedad Build Action. Perdí mucho tiempo golpeándome la cabeza. Inserté un archivo de código csharp con .txt adjunto a su nombre (xxx.cs.txt). Por alguna razón, los métodos GetManifestResourceNames () y GetManifestResourceStream () no verán un archivo con .cs en su nombre.
Lo renombré simplemente xxx.txt y todo estuvo bien.
Extraño.
fuente
Resource
pero noEmbedded Resource
, lo que lo hace aún más extraño ... Quitar.cs.
del nombre lo hace funcionar. Argh.Tuve el mismo problema, gracias a Jay descubrí que había guiones en el nombre del directorio.
ProjectName.ResourceFolder.Sub-Directory
se convierte enProjectName.ResourceFolder.Sub_Directory
cuando hace referencia al flujo de recursos.fuente
En mi caso, el problema fue que el código que buscaba el recurso estaba en un proyecto diferente al del propio recurso.
Solo puede acceder a los recursos que están en el mismo proyecto que el código. Pensé que podría poner todos mis recursos en el proyecto de la página web, pero también necesito imágenes en el proyecto de correo.
Espero que esto ayude a alguien en la misma situación que yo.
Encuentro llamadas realmente útiles
Assembly.GetExecutingAssembly().GetManifestResourceNames();
.fuente
En caso de que ayude a alguien más, asegúrese
Assembly.GetExecutingAssembly()
de que se llame a la línea desde el mismo ensamblado que tiene recursos integrados.fuente
Una solución simple y optimizada es tener esta clase base :
Luego, cuando agrega un recurso, crea una clase de lector C # en la misma carpeta:
donde la clase de lector MyResource.cs es muy simple:
Entonces, cada recurso tendrá una clase "sombra" que sepa leerlo correctamente.
Así es como lee el recurso en su código:
Y como sugirieron otras respuestas, no olvide establecer "Recurso incrustado" en la propiedad Acción de compilación del archivo de recursos.
La ventaja de esta solución uniforme es
fuente
fuente
Necesitas descargar tu solución, luego edita el proyecto, luego encuentra tu carpeta y cambia así:
fuente
Aunque OP obtuvo GetManifestResourceStream devolviendo NULL de los recursos en el mismo ensamblado, algunas respuestas sugirieron que cuando los recursos están en otro proyecto o ensamblado no se pueden recuperar y son una causa justa de que GetManifestResourceStream devuelva NULL.
Esto no es cierto, al menos desde 2011; como señalé en algunos comentarios en otro lugar, Assembly.LoadFrom () o typeof hacen el truco y, como resultado, puede acceder a los recursos que están en otro proyecto.
Tengo aquí un ejemplo moderadamente complejo para ilustrar; esta es mi configuración de prueba:
Camino a otro proyecto:
Capturado aquí:
Y en Form1.cs de WinFormFramework especifico con
como eso:
Y el resultado se muestra en el cuadro de texto:
Pasé varias horas para hacerlo bien; para eso, tuve que usar mucho estos en Immediate Window:
Espero que ayude a alguien
fuente
Probablemente necesite especificar la ruta a su archivo txt en el
GetManifestResourceStream
parámetro, o podría intentar pegar el archivo txt en el mismo directorio que su ejecutable. ¡Espero que ayude!fuente