¿Qué significa MissingManifestResourceException y cómo solucionarlo?

La situación:

  • Tengo una biblioteca de clases, llamada RT.Servers , que contiene algunos recursos (de tipo byte[] , pero no creo que eso sea importante)
  • La misma biblioteca de clase contiene un método que devuelve uno de esos recursos
  • Tengo un progtwig simple (con una referencia a esa biblioteca) que solo llama a ese único método

Obtengo una MissingManifestResourceException con el siguiente mensaje:

No se pudieron encontrar recursos apropiados para la cultura especificada o la cultura neutral. Asegúrese de que “Servers.Resources.resources” esté incrustado o vinculado correctamente en el ensamblado “RT.Servers” en tiempo de comstackción, o que todos los ensamblajes satelitales requeridos sean cargables y estén completamente firmados.

Nunca he jugado con culturas, o con la firma de assembly, así que no sé qué está pasando aquí. Además, esto funciona en otro proyecto que utiliza la misma biblioteca. ¿Algunas ideas?

Todo lo que tenía que hacer para solucionar este problema era hacer clic con el botón derecho en el archivo Resources.resx en el Explorador de soluciones y hacer clic en Ejecutar herramienta personalizada . Esto vuelve a generar el archivo de Resources.Designer.cs generado automáticamente.

Si el archivo .resx se agregó al proyecto manualmente, la propiedad Herramienta personalizada del archivo debe establecerse en “ResXFileCodeGenerator”.

El problema se debe a una falta de coincidencia de espacios de nombres, que ocurre si cambia el “espacio de nombres predeterminado” del ensamblaje en la configuración del proyecto. (Lo cambié de (anteriormente) "Servers" a (ahora) "RT.Servers" ).

En el código generado automáticamente en Resources.Designer.cs , está el siguiente código:

 internal static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Servers.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; } } 

La cadena literal "Servers.Resources" tuvo que ser cambiada a "RT.Servers.Resources" . Hice esto manualmente, pero ejecutar la herramienta personalizada también lo hubiera hecho bien.

Hoy me encontré con este problema y encontré esta página de Ayuda y soporte técnico de Microsoft que realmente solucionó el problema.

Tenía un par de delegates en la parte superior de mi archivo, en el espacio de nombres global, y de repente estaba obteniendo una MissingManifestResourceException al ejecutar el progtwig, en esta línea:

 this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 

Luego moví a los delegates al espacio de nombres, obtuve el mismo error. Finalmente puse a los delegates en la única clase en ese archivo, y el error desapareció, pero no quería los delegates en esa clase o espacio de nombres.

Luego me encontré con ese enlace de arriba, que decía

Para resolver este problema, mueva todas las otras definiciones de clase para que aparezcan después de la definición de clase del formulario.

Puse los delegates (que no consideraría “definiciones de clase”) en la parte inferior de ese archivo, fuera del espacio de nombres local, y el progtwig ya no recibió la MissingManifestResourceException . Qué error irritante. Pero parece una solución más sólida que modificar el código autogenerado 🙂

Me encontré con un problema similar y, aunque sé que no es la causa del OP, lo publicaré aquí para que, si alguien más se encuentra con este problema en el futuro, una respuesta esté disponible.

Si agrega una clase antes de la clase de diseñador, obtendrá una excepción MissingManifestResourceException en tiempo de ejecución (sin error o advertencia en tiempo de comstackción) porque

Visual Studio requiere que los diseñadores usen la primera clase en el archivo.

Para (un poco) más información, vea esta publicación .

Tuve el mismo problema, pero usar el comando Ejecutar herramienta personalizada como lo sugirió Timwi no me ayudó en mi caso.

Sin embargo, me condujo en la dirección correcta, porque terminé en las propiedades del archivo .resx . Aquí noté una diferencia con otro archivo .resx que no causó problemas.

En mi caso, tuve que cambiar la propiedad “Build Action” de “Resource” a “Embedded Resource”.

Mi mejor estimación es que tuve el .resx en una biblioteca que se usó desde otra aplicación. Mi aplicación no tenía su propio archivo .resx , por lo que tenía que usar el de la biblioteca, que solo está disponible cuando está incrustado en la biblioteca y no “independiente”.

Cuando corro en un problema similar, en Vs 2012, resultó que la propiedad “Espacio de nombres de herramientas personalizadas” del archivo resx era incorrecta (en mi caso, en realidad, no estaba configurada, por lo que el código generado emitía esta excepción en tiempo de ejecución) . Mi conjunto final de propiedades para el archivo resx era algo como esto:

  • Acción de comstackción: Recurso integrado
  • Copiar al directorio de salida: no copiar
  • Herramienta personalizada: ResXFileCodeGenerator
  • Espacio de nombres de herramientas personalizadas: My.Project.S.Proper.Namespace

Me encontré con una causa diferente de este problema, que no estaba relacionada con los archivos resx. Tenía una biblioteca de clase donde AssemblyInfo.cs contenía lo siguiente:

 [assembly: ThemeInfo( ResourceDictionaryLocation.SourceAssembly, ResourceDictionaryLocation.SourceAssembly)] 

El ensamblado no contenía ningún código WPF, tema o diccionarios de recursos. Me deshice de la excepción al eliminar el atributo ThemeInfo.

No recibí una excepción real, solo

Una excepción de primera oportunidad del tipo ‘System.Resources.MissingManifestResourceException’.

Al ver los detalles de la excepción, el sistema solicitaba MyAssembly.g.resources

Espero que esto pueda ser de ayuda para otra persona.

No estoy seguro si ayudará a las personas, pero esta funcionó para mí:

Entonces el problema que tuve fue que recibía el siguiente mensaje:

No se pudieron encontrar recursos apropiados para la cultura especificada o la cultura neutral. Asegúrese de que “My.Resources.Resources.resources” esté incrustado o vinculado correctamente en el ensamblado “X” en el momento de la comstackción, o que todos los ensamblajes satelitales requeridos sean cargables y estén completamente firmados “.

Estaba intentando obtener los recursos que estaban incrustados en mi proyecto de otra biblioteca de clase.

Lo que hice para solucionar el problema fue establecer el Modificador de acceso en la pestaña Proyecto-> Propiedades-> Recursos de “Interno” (accesible solo dentro de la misma biblioteca de clases) a “Público” (accesible desde otra biblioteca de clases)

Entonces corre y voilà, no más error para mí …

También vea: MissingManifestResourceException al ejecutar pruebas después de comstackr con MSBuild (.mresource tiene ruta en manifiesto)

Repito la respuesta aquí solo para completar:

Parece que agregar LogicalName al archivo de proyecto lo corrige:

 $(RootNamespace).Properties.Resources.resources 

es decir, la entrada del recurso incrustado en el archivo del proyecto se ve así:

   ResXFileCodeGenerator Resources.Designer.cs $(RootNamespace).Properties.Resources.resources   

Esto se detalla en: http://blogs.msdn.com/b/msbuild/archive/2007/10/19/manifest-resource-names-changed-for-resources-files.aspx

Tenga en cuenta que estamos utilizando un archivo .resx, pero el error aún parece ocurrir.

Actualización: el problema con los recursos (incluido XAML) parece estar relacionado con las rutas de salida y el uso de barras diagonales hacia adelante o hacia atrás como se detalla en: ¿Por qué la modificación de los directorios de salida del proyecto causa: IOException no fue manejada “No se puede localizar el recurso ‘app.xaml’ ”

La solución dada por BlaM también funcionó para mí.

Soy un usuario de VS 2013. Después de pasar por muchas correcciones pero no tuve suerte, intenté esto:

  1. Haga clic derecho en el archivo de recursos, uno por uno, en el caso de varios archivos.
  2. Asegúrese de que la propiedad “Crear acción” esté configurada como “Recurso incrustado”.

¡Eso es! 🙂

Tuve el mismo problema, pero en mi caso coloco una clase en un control de usuario que está relacionado con el control de usuario como este

 Public Class MyUserControlObject end Class Public Class MyUserCOntrol end Class 

La solución fue mover el MyUserControlObject al final de la clase Usercontrol, como este

 Public Class MyUserCOntrol end Class Public Class MyUserControlObject end Class 

espero que esto ayude

Obtenía el error MissingManifestResourceException después de transferir mi proyecto de VS2005 a VS2010. No tenía ninguna otra clase definida en el archivo que contiene mi clase de formulario. Y también tenía mi nombre de archivo de recursos de resx configurado correctamente. No funcionó

Así que borré los archivos de resx y los regeneré. Todo bien ahora.

Recientemente me encontré con el mismo problema, luché un poco, encontré este tema pero no hubo respuestas correctas para mí.

Mi problema fue que cuando StartupUri ventana principal de mi proyecto WPF (no tiene una ventana principal), olvidé eliminar StartupUri de App.xaml . Supongo que esta excepción puede ocurrir si tienes un error en StartupUri , así que en caso de que alguien tenga problemas con esto, revisa tu StartupUri en App.xaml .

Porque estoy comstackndo previamente mi aplicación web (utilizando la función de publicación de VS2012). Estaba recibiendo el error anterior. Probé todas las sugerencias, ¡pero el extraño cambio de ‘Crear acción’ a ‘Contenido’ hizo el truco!

En mi caso, tengo una aplicación web con recursos y creo un paquete nuget a partir de eso. Cuando uso este nuget en otros proyectos, me doy cuenta de que cuando solicito una API con recursos, obtengo la excepción MissingManifestResourceException luego de un poco de búsqueda, aprendo que el empaquetador nuget no está empacando recursos automáticamente. Si desea usar archivos de recursos, debe hacerlo manualmente. Por lo tanto, debe agregar las siguientes líneas a su archivo .nuspec: (Visite https://github.com/NuGet/Home/issues/1482 )

         

Pero, antes de agregar archivos, debe estar seguro de qué versión de .net está usando.

Recientemente tropecé con este problema, en mi caso hice algunas cosas:

  1. Asegúrese de que los espacios de nombres sean consistentes en el archivo Designer.cs del archivo resx

  2. Asegúrese de que el espacio de nombre predeterminado de la Asamblea (haga clic con el botón derecho en el proyecto y elija Propiedades) esté configurado de la misma manera en el espacio de nombres en el que se encuentra el archivo de recursos.

Una vez que hice el paso 2, la excepción desapareció.

Tuve el con un proyecto F # recién creado. La solución fue desmarcar “Usar nombres de recursos estándar” en las propiedades del proyecto -> Aplicación -> Recursos / Especificar cómo se administrarán los recursos de la aplicación. Si no ve la casilla, actualice su Visual Studio. Tengo 15.6.7 instalado. En 15.3.2, esta checkbox no está allí.

Desde la página de soporte de Microsoft :

Este problema se produce si utiliza un recurso localizado que existe en un ensamblaje satélite que creó utilizando un archivo .resources que tiene un nombre de archivo inapropiado. Este problema normalmente ocurre si crea manualmente un ensamblaje de satélite.

Para evitar este problema, especifique el nombre de archivo del archivo .resources cuando ejecuta Resgen.exe. Mientras especifica el nombre de archivo del archivo .resources, asegúrese de que el nombre del archivo comience con el nombre del espacio de nombres de su aplicación. Por ejemplo, ejecute el siguiente comando en el símbolo del sistema de Microsoft Visual Studio .NET para crear un archivo .resources que tenga el nombre del espacio de nombres de su aplicación al comienzo del nombre del archivo:

 Resgen strings.CultureIdentifier.resx MyApp.strings.CultureIdentifier.resources