2009-08-25 33 views
123

La situación:¿Qué significa MissingManifestResourceException y cómo solucionarlo?

  • tengo una biblioteca de clases, llamado RT.Servers, que contiene algunos recursos (de tipo byte[], pero no creo que eso es importante)
  • la misma biblioteca de clase contiene un método que devuelve uno de esos recursos
  • tengo un programa simple (con una referencia a la biblioteca) que sólo las llamadas que un único método

recibo una MissingManifestResourceException con la siguiente Messa GE:

No se pudo encontrar ningún recurso apropiados para la cultura especificada o la cultura neutral. Asegúrese de que los "Servers.Resources.resources" se insertan correctamente o vinculado en montaje "RT.Servers" en tiempo de compilación, o que todos los ensamblados satélite requeridos se pueden cargar y totalmente firmados.

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

+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. –

+0

Lo sentimos, pero es una forma de Microsoft: ** eliminar todo, y luego agregar de nuevo **. Funciona para recursos, NUGET, referencias y cadenas de conexión. Hay muchas herramientas, pero dedicarás tiempo a los archivos sin formato en casos no habituales ... – maxkoryukov

Respuesta

188

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

Si el archivo .resx se agregó manualmente al proyecto, 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 nombre 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, existe 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 cambiado a "RT.Servers.Resources". Hice esto manualmente, pero ejecutar la herramienta personalizada también lo hubiera hecho bien.

+5

¡Esto me ahorró mucho tiempo! – Eric

+8

Te amo. :-) – Stimul8d

+1

+1! En VS 2010, la cadena literal de ResourceManager que se muestra arriba se actualiza automáticamente al valor del espacio de nombre predeterminado en las propiedades del proyecto (pestaña Aplicación), al menos para WinForms. – TrueWill

-3

De the Microsoft support page:

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

Para solucionar este problema, especifique el nombre de archivo del archivo .resources cuando ejecute 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 Visual Studio .NET de Microsoft para crear un archivo .resources que tiene el nombre de espacio de nombres de su aplicación al principio del nombre de archivo:

Resgen strings.CultureIdentifier.resx 
MyApp.strings.CultureIdentifier.resources 
+1

Gracias por tu 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 solucionar esto desde Visual Studio? Por ejemplo, como dices que el recurso está "localizado", ¿cómo declaro un recurso como no localizado? Gracias de nuevo. – Timwi

29

Acabo de encontrarme con este problema hoy, y encontré this Microsoft Help and Support page que realmente solucionó el problema.

tuve un par delegados en la parte superior de mi archivo, en el espacio de nombres global, y, de repente, que era conseguir una MissingManifestResourceException cuando se ejecuta el programa, en esta línea:

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

Entonces me moví los delegados en el espacio de nombres, obtuvieron el mismo error. Finalmente puse a los delegados en la única clase en ese archivo, y el error desapareció, pero no quería los delegados en esa clase o espacio de nombres.

Entonces me encontré con que el enlace de arriba, que dijo

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

puse 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 consiguió el MissingManifestResourceException más. Qué error irritante. Sin embargo, eso parece una solución más robusta que la modificación del código generado automáticamente :)

+0

Gracias por tu respuesta. Esto 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 arreglado solo. No tengo idea de por qué el proceso de compilación no lo hizo automáticamente. – Timwi

+6

Recibí 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! –

+2

Eso funcionó para mí, ¡gracias! – niklon

14

que tenía el mismo problema, pero utilizando el comando Ejecutar Herramienta personalizada como suggested by Timwi no ayudó en mi caso.

Sin embargo, me llevan en la dirección correcta, ya que terminé en los Propiedades del archivo .resx . Aquí noté una diferencia en 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 utilizó 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 es "independiente".

+2

+1 gracias, revisé 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 establecido en Content, y después de cambiarlo a Embedded Resource, todo funcionó bien. Tonto descuido –

+1

Gracias! Esto funcionó para mí donde tenía algunos archivos de texto que contenían contenido para pruebas o algunas reglas de mapeo de negocios. Cambiar de Contenido a Recurso incrustado solucionó el problema. –

+0

Esto funcionó como un encanto, gracias BlaM! – bignermo

20

Me he encontrado 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 estará disponible .

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

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

Para (un poco) más información, vea this post.

+8

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 tu respuesta fue acertada para mi problema. – RenniePet

+2

Lo mismo - gracias por tomarse el tiempo para publicarlo aquí! – Smashery

1

Recibí 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 eliminé los archivos resx y los regeneré. Todo bien ahora.

2

Véase también: MissingManifestResourceException when running tests after building with MSBuild (.mresource has path in manifest)

repito la respuesta aquí simplemente para la corrección:

Aparece añadiendo logicalName al archivo de proyecto lo fija:

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

es decir, lo que la entrada de recursos incrustado en el archivo de 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 utilizando un archivo .resx, pero parece que la falla todavía ocurre.

Actualización: El problema de los recursos (Incl. XAML) parece estar relacionada con las rutas de salida y la utilización de avance o barras invertidas como se detalla en: Why does modifying project output directories cause: IOException was unhandled "Cannot locate resource 'app.xaml'."

0

porque soy pre-recopilando 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!

2

No es seguro que ayudará a la gente pero éste trabajó para mí:

lo tanto, el problema que tuve fue que estaba recibiendo el siguiente mensaje:

podido encontrar recursos apropiados para la especificada cultura o la cultura neutral. Asegúrese de que "My.Resources.Resources.resources" se insertan correctamente o vinculado en el ensamblado "X" en tiempo de compilación, o que todos los ensamblados satélite requeridos son cargables y totalmente firmado"

yo estaba tratando de obtener la recursos que estaban incrustados en mi proyecto desde otra biblioteca de clases.

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 clase biblioteca) a "Público" (accesible desde otra biblioteca de clases)

Luego ejecute y voilà, no más errores para mí ...

10

Cuando me encuentro con 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 y esto excepción en tiempo de ejecución). Mi última serie de propiedades para el resx fue algo como esto:

  • acción Construye: Recurso incrustado
  • Copiar al Directorio de salida: No copie
  • Herramienta personalizada: ResXFileCodeGenerator
  • Espacio de nombres de herramientas personalizadas: My.Project.S.Proper.Namespace
+0

Gracias hombre! ¡Esto me salvó! – ib11

2

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

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

El montaje no contiene ningún código, temáticos o recurso diccionarios WPF. Me deshice de la excepción al eliminar el atributo ThemeInfo.

no he tenido una excepción real, solamente

Una primera excepción del tipo 'System.Resources.MissingManifestResourceException'.

Visualización de detalles de la excepción, el sistema estaba solicitando MyAssembly.g.resources

la esperanza que esto podría ser de ayuda a otra persona.

+1

¡Gracias por esto! ¡Exactamente la solución que necesitaba! Ocurre cuando crea accidentalmente un proyecto de ViewModel como biblioteca de Control. –

+0

Gracias. Esto me lo arregló. – Jamleck

1

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

Mi problema fue que cuando eliminé la 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 tiene un error en StartupUri, por lo que en caso de que alguien tenga problemas con esto, verifique su StartupUri en App.xaml.

1

La solución proporcionada por BlaM también me ha funcionado.

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

  1. Haz 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 "Crear acción" esté configurada como "Recurso incrustado".

Eso es todo!:)

+0

Confirmando esto. Tengo un proyecto en funcionamiento pero necesitaba mantener los ensamblajes de recursos por separado, así que intenté cambiar de "Recurso incrustado" a simplemente "Recurso" y terminé obteniendo la excepción MissingResourceManifestException. –

1

que tenían el mismo problema, pero en mi caso me coloca una clase en un control de usuario que está relacionada con el control de usuario como esto

Public Class MyUserControlObject 

end Class 

Public Class MyUserCOntrol 

end Class 

la solución era mover el MyUserControlObject hasta el final de la usercontrol clase, como este

Public Class MyUserCOntrol 

end Class 

Public Class MyUserControlObject 

end Class 

espero que esto ayude a

0

En mi caso, tengo una API web con recursos y crear un paquete Nuget lado a otro m eso. Cuando uso este nuget en otros proyectos, me doy cuenta de que cuando solicito una API con recursos, recibo MissingManifestResourceException después 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. Así que hay que añadir a continuación las líneas a su archivo .nuspec: (visita 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 añadir archivos, usted necesita estar seguro de la versión de .NET que está utilizando.

0

Recientemente nos topamos con este tema, en mi caso lo hice un par de cosas:

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

  2. Asegúrese de que el nombre por defecto de la Asamblea (clic derecho en el proyecto y seleccione Propiedades) se establece la misma al espacio de nombres del archivo de recursos está en.

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

Cuestiones relacionadas