¿Qué significa MissingManifestResourceException y cómo solucionarlo?

151

La situación:

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

Recibo un MissingManifestResourceExceptionmensaje 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é correctamente incrustado o vinculado en el ensamblado "RT.Servers" en el momento de la compilación, o que todos los ensambles de satélite necesarios sean cargables y estén totalmente firmados.

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

Timwi
fuente
2
Esta es una de las excepciones más inútiles en .NET. Se desencadena en al menos 3 escenarios que no comparten nada en común.
rr-
1
Lo sentimos, pero es una forma de Microsoft: eliminar todo y luego agregar nuevamente . Funciona para recursos, NUGET, referencias y cadenas de conexión. Hay muchas herramientas, pero pasará tiempo para los archivos sin formato en casos no habituales ...
maxkoryukov

Respuestas:

238

Todo lo que necesitaba hacer para solucionar este problema era hacer clic derecho en el Resources.resxarchivo en el Explorador de soluciones y hacer clic en Ejecutar herramienta personalizada . Esto vuelve a generar el Resources.Designer.csarchivo autogenerado .

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 los espacios de nombres, que ocurre si cambia el "espacio de nombres predeterminado" del ensamblado 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, hay 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". Lo hice manualmente, pero ejecutar la herramienta personalizada lo habría hecho igualmente bien.

Timwi
fuente
9
¡Esto me ahorró mucho tiempo!
Eric
1
+1! En VS 2010, la cadena literal de ResourceManager que se muestra arriba se actualiza automáticamente al valor del Espacio de nombres predeterminado en las propiedades del proyecto (pestaña Aplicación), al menos para WinForms.
TrueWill
2
¿Qué sucede si no tiene un archivo resources.resx?
cenizas999
@ ashes999: ¿Has buscado en la carpeta Propiedades? Ahí es donde suele estar al menos para proyectos de C #.
RenniePet
He tenido el mismo problema. El archivo .resx se agregó al proyecto manualmente, la propiedad de la herramienta personalizada del archivo que configuré en "ResXFileCodeGenerator". Luego el archivo resx es primero y luego el archivo designer.vb más tarde. archivo .resx posterior. ¿Cómo puedo hacerlo ...?
Kavitha
37

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 delegados en la parte superior de mi archivo, en el espacio de nombres global, y de repente recibí un mensaje MissingManifestResourceExceptional ejecutar el programa, en esta línea:

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

Luego moví a los delegados al espacio de nombres, obtuve el mismo error. Finalmente puse a los delegados en la única clase en ese archivo, y el error desapareció, pero no quería que los delegados 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 demás definiciones de clase para que aparezcan después de la definición de clase del formulario.

Puse a los delegados (que no consideraría "definiciones de clase") en la parte inferior de ese archivo, fuera del espacio de nombres local, y el programa no obtuvo MissingManifestResourceExceptionmás. Qué error tan irritante. Pero, eso parece una solución más robusta que modificar el código generado automáticamente :)

Mark Rushakoff
fuente
Gracias por tu respuesta. Parece que tuvo un problema diferente que causó el mismo síntoma. No tenía clases adicionales en mi código, de hecho, ni siquiera tenía ningún formulario. Debería editar mi respuesta anterior porque descubrí que en realidad no necesitaba modificar el código generado automáticamente. Podría haber vuelto a ejecutar el generador de código, y se habría solucionado solo. No tengo idea de por qué el proceso de compilación no lo hizo automáticamente.
Timwi
77
Obtuve el error debido a que agregué una clase sobre la clase del Formulario en el archivo Form1.cs (como se discutió en la sección "Resolución" del enlace que proporcionó). ¡Gracias!
Matt Smith
El mismo problema; nada más funcionaba, así que simplemente eliminé la línea: this.Icon = ((System.Drawing.Icon) (resources.GetObject ("$ this.Icon"))); porque no me importa el icono en esa forma particular :)
Gary Huckabone
Esa es la respuesta. Gracias.
Sertan Pekel
Si alguien se confundió, tuve una clase llamada "StringExtensions" antes del bit "Form1" de Form1.cs, lo moví debajo de Form1 en form1.cs en lugar de arriba y funcionó
Ma Dude
31

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

Si agrega una clase antes de la clase de diseñador, obtendrá una MissingManifestResourceExceptionexcepción en tiempo de ejecución (sin error ni advertencia de tiempo de compilación) porque

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

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

Motti
fuente
12
Gracias por publicar esta "respuesta". A pesar de estar "fuera de tema" en relación con el problema del OP, fue una buena idea publicarlo aquí. Una búsqueda de MissingManifestResourceException me llevó a este hilo, y su respuesta fue acertada para mi problema.
RenniePet
16

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

Sin embargo, me llevó 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 conjetura es que tenía 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 tuvo que usar el de la biblioteca, que solo está disponible cuando está incrustado en la biblioteca y no "independiente".

BlaM
fuente
2
+1 gracias, verifiqué dos veces mis archivos de recursos que también están en una biblioteca separada a la que hacen referencia otras aplicaciones. Tenía Build Action configurado en Content, y después de cambiarlo a Embedded Resource, todo funcionó bien. Supervisión tonta
Shan Plourde
1
¡Gracias! Esto funcionó para mí donde tenía algunos archivos de texto que contenían contenido para pruebas o algunas reglas de mapeo empresarial. El cambio de contenido a recurso incorporado solucionó el problema.
S. Baggy
12

Cuando ejecuté un problema similar, en Vs 2012, resultó que la propiedad "Espacio de nombres de herramienta personalizada" del archivo resx era incorrecta (en mi caso, en realidad, no estaba configurada, por lo que el código generado generó esta excepción en tiempo de ejecución) . Mi conjunto final de propiedades para el archivo resx fue algo como esto:

  • Acción de compilación: recurso incorporado
  • Copiar al directorio de salida: no copiar
  • Herramienta personalizada: ResXFileCodeGenerator
  • Espacio de nombres de herramienta personalizada: My.Project.S.Proper.Namespace
Starnuto di topo
fuente
3

Ver también: MissingManifestResourceException cuando se ejecutan pruebas después de compilar con MSBuild (.mresource tiene ruta en manifiesto)

Repito la respuesta aquí solo para completar:

Parece que agregar LogicalName al archivo del proyecto lo corrige:

<LogicalName>$(RootNamespace).Properties.Resources.resources</LogicalName> 

es decir, la entrada de recursos incrustados en el archivo del proyecto se ve así:

<ItemGroup>
  <EmbeddedResource Include="Properties\Resources.resx">
    <Generator>ResXFileCodeGenerator</Generator>
    <LastGenOutput>Resources.Designer.cs</LastGenOutput>
    <LogicalName>$(RootNamespace).Properties.Resources.resources</LogicalName> 
  </EmbeddedResource>
</ItemGroup>

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 usando un archivo .resx, pero el error todavía 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 se manejó "No se puede encontrar el recurso 'app.xaml' ".

nietras
fuente
Después de aproximadamente ocho horas depurando este problema, y ​​literalmente rastreando cada respuesta de github, SO y Google, esta es la respuesta que resolvió mi problema ... foww, mi problema comenzó a ocurrir después de migrar de .Net 3.5 a 4.7.2.
Neville
3

Me encontré con una causa diferente de este problema, que no estaba relacionada con los archivos resx. Tenía una biblioteca de clases 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. Eliminé la excepción al eliminar el atributo ThemeInfo.

No obtuve 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 alguien más.

Pie Grande
fuente
2
¡Gracias por esto! ¡Exactamente la solución que necesitaba! Ocurre cuando accidentalmente crea un proyecto ViewModel como una biblioteca de Control.
Andrew Hanlon
Gracias. Esto me lo arregló.
Jamleck
2

No estoy seguro de que ayudará a las personas, pero este 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é correctamente incrustado o vinculado en el ensamblado "X" en el momento de la compilación, o que todos los ensambles de satélite requeridos sean cargables y estén totalmente firmados "

Estaba tratando de obtener los recursos que estaban integrados en mi proyecto de otra biblioteca de clase.

Lo que hice para solucionar el problema fue configurar 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 errores para mí ...

codingismylife
fuente
2

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 sin suerte, probé esto:

  1. Haga clic con el botón derecho en el archivo de recursos, uno por uno, en el caso de varios archivos.
  2. Asegúrese de que la propiedad "Acción de compilación" esté establecida en "Recurso incorporado".

¡Eso es! :)

Jiten
fuente
Confirmando esto. Tengo un proyecto que funciona pero necesitaba mantener los ensambles de recursos por separado, así que intenté cambiar de "Recurso incorporado" a simplemente "Recurso" y terminé obteniendo la excepción MissingResourceManifestException.
Mosca Pt
2

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 MyUserControlObjectal final de la clase Usercontrol, así

Public Class MyUserCOntrol

end Class

Public Class MyUserControlObject

end Class

espero que esto ayude

Herrero
fuente
Hable acerca de una descripción de error horrible ... Agregué una clase auxiliar al archivo CS del formulario principal. Nunca habría adivinado que el mensaje de error se vincularía a esto. ¡Gracias!
Adam Lewis
1

Recibí el error MissingManifestResourceException después de portar mi proyecto de VS2005 a VS2010. No tenía otras clases definidas en el archivo que contiene mi clase Form. Y también tenía mi nombre de archivo de recursos resx configurado correctamente. No funciono

Así que eliminé los archivos resx y los regenere. Todo bien ahora.

Winston
fuente
1

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 quité ventana principal de mi proyecto WPF (que no tiene una ventana principal), se me olvidó quitar StartupUride App.xaml. Creo que esta excepción puede ocurrir si tiene un error en StartupUri, por lo que en caso de que si alguien está luchando con esto - compruebe su StartupUrien App.xaml.

Archeg
fuente
1

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

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

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

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

soldado de asalto
fuente
1

Tuve este problema cuando agregué otra clase en el archivo justo antes de la clase que derivaba de Form. Agregarlo después de solucionar el problema.

franckspike
fuente
1

También puede ocurrir el mismo error cuando coloca una nueva clase en el código fuente de la clase de un formulario creado por el diseñador.

Esta nueva clase se puede eliminar y colocar en un archivo cs diferente.

(Al menos en mi caso, este era el problema ...)

István Nagy
fuente
0

Porque estoy precompilando mi aplicación web (usando la función de publicación VS2012). Estaba recibiendo el error anterior. Intenté todas las sugerencias, ¡pero cambiar extrañamente 'Build Action' por 'Content' hizo el truco!

Markive
fuente
0

En mi caso, tengo una API 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, MissingManifestResourceExceptionobtengo un poco de investigación, aprendo que nuget packager no empaca recursos automáticamente. Si desea utilizar 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 )

<package> 
    <metadata>
    </metadata>
    <files>
        <file src="bin\Debug\en\MyAssembly.resource.dll" target="lib\net40\en\MyAssembly.resource.dll" />
        <file src="bin\Debug\es\MyAssembly.resource.dll" target="lib\net40\es\MyAssembly.resource.dll" />
    </files>
</package>

Pero, antes de agregar archivos, debe asegurarse de qué versión de .net está utilizando.

dcy
fuente
0

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 de verificación, actualice su Visual Studio. Tengo 15.6.7 instalado. En 15.3.2 esta casilla de verificación no está allí.

KCT
fuente
0

Solo por mencionar. Si usa una constante o literal, asegúrese de que se refiera a un recurso del formulario ProjectName.Resourcesy no contenga Resources.resx.

Podría ahorrarte una o dos horas.

hierba
fuente
0

He encontrado este problema con el proyecto C ++ administrado basado en WinForms después de cambiar el nombre del espacio de nombres global (no manualmente, sino con la herramienta Cambiar nombre de VS2017).

La solución es simple, pero no se menciona en otra parte.

RootNamespaceDebe cambiar la entrada en vcxproj-file para que coincida con el espacio de nombres de C ++.

AntonK
fuente
0

En mi caso, fue un error tipográfico en el Xaml de una ventana abierta desde Winforms Form:

Incorrecto: <Image Source="/Resources/WorkGreen.gif"/>

Correcto: <Image Source="../Resources/WorkGreen.gif"/> puede ayudar a alguien

tretom
fuente
-3

Desde la página de soporte de Microsoft :

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

Para evitar este problema, especifique el nombre del archivo .resources cuando ejecute Resgen.exe. Mientras especifica el nombre 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
TheIdiot de la aldea
fuente
1
Gracias por su respuesta, pero no sé qué es ResGen.exe, nunca lo he usado y, francamente, no quiero usarlo porque no estoy tratando de usar nada elegante. ¿Seguramente debe haber una manera de arreglar esto desde Visual Studio? Por ejemplo, dado que usted dice que el recurso está "localizado", ¿cómo declaro un recurso como no localizado? Gracias de nuevo.
Timwi