2008-11-10 28 views
23

De forma predeterminada, cuando agrega una imagen (icono, mapa de bits, etc.) como recurso a su proyecto, la Acción de compilación se establece en Ninguna. Esto se hace porque la imagen está almacenada mágicamente dentro de un archivo .resources.Visual Studio: cómo almacenar un recurso de imagen como un recurso incrustado?

I desea que el recurso se almacena como un recurso incrustado (mis razones son irrelevantes, pero vamos a pretender que es para que pueda verlas en el interior RedGate's Reflector).

Así que cambió Acción construcción de cada imagen a Recurso incrustado, y el recurso a continuación, aparece dentro Reflector de Lutz - exactamente como yo quiero.

Desafortunadamente, Microsoft says specifically not to do this:

Tenga en cuenta que cuando el editor de recursos añade una imagen, se establece Acción de generación a Ninguno, porque el archivo .resx referencias del archivo de imagen. En el tiempo de compilación , la imagen se extrae en el archivo .resources creado a partir del archivo .resx . A la imagen se puede acceder fácilmente a a través de la clase fuertemente tipada autogenerada para el archivo .resx .

Por lo tanto, no se debe cambiar esta configuración para Recurso incrustado, porque hacerlo sería incluir en la imagen dos veces en el montaje.

Entonces, ¿cuál es la forma correcta de para incluir una imagen como un recurso incrustado?

Respuesta

43

Nota: Esta respuesta no es la forma recomendada de gestionar los recursos de imagen. Simplemente trata el problema particular como se describe en la pregunta (es decir, para incluir una imagen como recurso integrado).

No agregue la imagen como recurso.Yo prefiero hacer lo siguiente:

  • crear la imagen/icono y guardarlo en un archivo de
  • Seleccione Proyecto -> Agregar elemento existente y añadir el archivo
  • Establecer la Acción de generación en Recurso incrustado

A continuación, puede acceder a este recurso mediante

Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceUri) 

De esta manera la imagen es no agregado mágicamente al archivo de recursos de proyectos y solo tendrá una copia de la imagen almacenada en los recursos del ensamblaje.

+0

¿Por qué esta respuesta ha sido rechazada? –

+0

Esto suena como una buena respuesta, pero tendré que esperar para probarlo antes de poder aceptarlo. –

+1

La desventaja de esta solución es que no obtendrá el nombre autogenerado para el recurso (por ejemplo, en VB .NET, My.Resources.NameOfYourImage. Pero si eso no le molesta, entonces es probablemente la mejor solución. –

5

Esto depende de cómo quiera usar la imagen.

Si desea localizar y acceder a las imágenes específicas de una cultura específica, a continuación, utilizando el ResourceManager es una buena manera de ir, ya que proporciona algunas funciones agradable para ensamblados satélite, buscando, retrocesos, etc.

Si solo desea insertar un recurso en un ensamblado y no está preocupado por la localización (usando Assembly.GetManifestResourceStream) luego solo agregar una imagen y establecer la acción de compilación en Embedded Resource está bien.

La documentación le advierte sobre no establecer la acción de compilación en Embedded Resource porque el compilador de recursos ya compiló el recurso en el ensamblado a través del archivo .resx.

+0

Pero, ¿cómo establecer la Acción de generación en Recurso incrustado, y que no se someta doble incluido? –

6

En VS 2005:

  • Haga clic derecho sobre el proyecto y elija Agregar nuevo elemento.
  • Agregue un archivo de recursos. Llamada es myImages.resx
    Coloque este archivo en la carpeta raíz del proyecto.
  • Haga clic derecho sobre myImages.resx y seleccione Ver diseñador
  • Seleccione Agregar recursos, Añadir existente archivo.
  • Busque la imagen, por ejemplo stop.bmp
    Esta imagen no tiene que incluirse en el proyecto en esta etapa. El archivo de recursos hará esto automáticamente.

Para hacer referencia a la imagen en el uso de código algo como:

btnStop.Image = myImages.Stop; 
11

En la vista del proyecto, abra el subárbol Propiedades; haga doble clic en el elemento Resources.resx.

(Si no tiene una, haga clic derecho en el elemento Propiedades y elija Abrir, luego haga clic en la pestaña Recursos a la izquierda y haga clic en el enlace en la mitad de la página para crear un archivo de recursos predeterminado.)

haga clic en la primera lista desplegable en la parte superior de la página resources.resx. Probablemente diga algo inútil como "Cadenas" y seleccione Imágenes. Alternativamente, puede presionar Ctrl + . Esto cambia a la vista de recursos de Imagen. Ahora haga clic en la lista desplegable Agregar recurso y seleccione 'archivo existente'. Seleccione su archivo de imagen y haga clic en Abrir. Cambie el nombre del recurso si lo desea.

Haga clic en el icono Guardar.

Ahora puede acceder a su recurso incrustado mediante programación como:

[namespace].Properties.Resources.[yourResourceName] 
Cuestiones relacionadas