No se pudieron encontrar recursos apropiados para la cultura especificada o la cultura neutral

Tengo dos proyectos web ASP.NET (ProjectA y ProjectB). Cuando la clase en ProjectA crea una clase de ProjectB que usa un archivo de recursos Blah.resx, obtengo este error:

Se produjo una excepción del tipo ‘System.Resources.MissingManifestResourceException’ en mscorlib.dll pero no se manejó en el código de usuario.

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

¿Qué está causando esto?

Hay un artículo en el sitio de Microsoft sobre este http://support.microsoft.com/kb/318603 que sugiere:

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

Esta es una solución para el proyecto de Windows Forms, no estoy seguro de si eso también se aplica a proyectos web.

Acabo de llegar a esta misma excepción en un proyecto de WPF. El problema ocurrió en un ensamblado que recientemente cambiamos a otro espacio de nombres ( ProblemAssembly.Support to ProblemAssembly.Controls ). La excepción ocurría al intentar acceder a los recursos de un segundo archivo de recursos que existe en el ensamblado.

Resulta que el archivo de recursos adicionales no movió correctamente las referencias del antiguo nombre del espacio de nombres al nuevo nombre del espacio de nombres.

En designer.cs para el archivo de recursos, hay una propiedad estática para obtener el ResourceManager. Dentro de ese captador, la cadena aún estaba refiriendo el antiguo espacio de nombres. Una vez corregido en el nuevo espacio de nombres, el problema se resolvió:

 global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager( "ProblemAssembly.Support.Properties.Stuff", typeof(Stuff).Assembly); 

debería haber sido:

 global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager( "ProblemAssembly.Controls.Properties.Stuff", typeof(Stuff).Assembly); 

Espero que esto ayude a la próxima persona.

Resolví el problema así:

  1. Haga clic derecho en su ResourceFile
  2. Cambiar la propiedad “Build Action” Comstackr a “Recurso incrustado”
  3. Luego comstack y ejecuta

Funciona perfectamente

Cuando intenté compartir un archivo resource.resx de un proyecto C # con otro proyecto C #, obtuve este problema. La sugerencia de mover la clase Form al principio de su archivo no era apropiada. Así es como lo resolví. Básicamente, utiliza un enlace del segundo proyecto al primero, luego habilita la regeneración del archivo resource.designer.cs .

  1. Eliminar el archivo Properties/Resources.resx del segundo proyecto
  2. Agregue el archivo Properties/Resources.resx del primer proyecto como LINK a la carpeta Properties en el segundo proyecto. No lo agregue al nivel raíz del proyecto.
  3. ¡No agregue las Properties/Resources.designer.cs del primer proyecto!
  4. En las propiedades de Resources.resx del segundo proyecto, agregue ResXFileCodeGenerator como CustomTool
  5. Haga clic derecho en Resources.resx y seleccione “Run Custom Tool”. Esto generará un nuevo archivo designer.cs.

Nota: Evitaría editar el archivo resource.designer.cs, ya que esto se autogenera.

En mi caso, una serie de reemplazos de texto global mal pensados ​​había cambiado inadvertidamente esta línea en el archivo cs del diseñador de recursos.

enter image description here

Dado que el espacio de nombres en ese argumento ya no coincidía con el espacio de nombres de la clase, la aplicación se confundió en el tiempo de ejecución.

Compruebe que el espacio de nombres del diseñador coincida con el argumento de cadena en esa línea.

Sucede porque *.resх está excluido de la migración.

  • Haga clic derecho en su ResourceFile
  • Haga clic en el elemento del menú “Incluir en el proyecto”

Descubrí que eliminar el archivo designer.cs, excluyendo el archivo resx del proyecto y luego volver a incluirlo, a menudo solucionaba este tipo de problema, siguiendo una refactorización del espacio de nombres (según la respuesta de CFinck)

La respuesta de Sibi Elangos por sí sola no fue suficiente para mí, así que tuve que

  • Haga clic derecho en su ResourceFile
  • Cambiar la propiedad “Build Action”
  • Comstackr a “Recurso incrustado”
  • Construye y despliega

Esto generará un App_GlobalResources en su carpeta /bin , ahora copie esa carpeta también a la raíz de la aplicación web

Un enfoque sería colocar las clases / recursos compartidos en un proyecto de biblioteca de clases separado y derivarlos en ambos sitios web.

Gracias @CFinck! Solo para agregar un consejo a los demás: Cambié la línea ResourceManager con esto:

 New Global.System.Resources.ResourceManager(Reflection.Assembly.GetCallingAssembly.GetName.Name & ".CommonNameOf.Resources", Reflection.Assembly.GetCallingAssembly()) 

Estoy en vb.net pero creo que en C # la única diferencia sería + en lugar de & para concatenar cadenas.

De esta forma, puedo usar los mismos archivos de ensamblados vinculados en dos proyectos similares que comparten los recursos.

Dotfuscation también plantea este error, ya que un archivo de diseñador de resx se basa en la reflexión. Si está usando Dotfuscator, romperá sus archivos de resx. Siempre debe agregarlos como una exclusión del proceso de ofuscación.

Cuando estábamos usando

 HttpContext.GetGlobalResourceObject() 

Generaría ese error a menos que envuelvamos esa llamada dentro de una statement try / catch.

Tengo una aplicación WinForms con un solo proyecto en la solución.
Orientación de .NET Framework 4.0
Usando SharpDevelop 4.3 como mi IDE

Suena tonto, pero tuve la propiedad Logical Name establecida en "Resources" en mi archivo "Resources.resx" . Una vez que borre esa propiedad, todo funciona hunky-dory.

Normalmente, cuando agrega archivos aleatorios como EmbeddedResource , generalmente desea establecer el Logical Name en algo razonable, por alguna razón, hice lo mismo en el archivo Resources.resx y eso lo arruinó todo …

Espero que esto ayude a alguien.

En lo que respecta a este caso, compruebe si el conjunto que contiene recursos tiene el espacio de nombres predeterminado configurado para el mismo texto (Proyecto-> Propiedades-> Espacio de nombres predeterminado; en VS) Compruebe también si el archivo resx tiene una propiedad BuildAction establecida en “Incrustado”. recurso “Disfrutar …;)

Para mí, el problema fue copiar archivos .resx y archivos .cs asociados de un proyecto a otro. Ambos proyectos tenían el mismo espacio de nombres, así que ese no era el problema.

Finalmente lo resolví cuando noté en Solution Explorer que en el proyecto original los archivos .resx dependían de los archivos .cs:

 MyResource.cs |_ MyResource.resx 

Mientras estaba en el proyecto copiado, los archivos .cs dependían de los archivos .resx:

 MyResource.resx |_ MyResource.cs 

Resultó que en el segundo proyecto de alguna manera los archivos .resx habían sido configurados para generar automáticamente los archivos .cs. Los archivos .cs autogenerados sobrescribían los archivos .cs copiados del proyecto original.

Para solucionar el problema, edite las propiedades de cada archivo .resx en el proyecto copiado. La propiedad Herramienta personalizada se establecerá en algo como ResXFileCodeGenerator . Borre la propiedad Herramienta personalizada del archivo .resx. Tendrá que volver a copiar el archivo .cs del proyecto original, ya que habrá sido sobreescrito por el archivo generado automáticamente.

En mi caso, el problema causado por la definición de la clase de la manera incorrecta:

 namespace MyBuggyWorld { public class BackendObject //This hack broke the VS 2017 winform designer and resources linker! { public TcpClient ActiveClient { get; set; } public BackgroundWorker ActiveWorker { get; set; } } public partial class FormMain : Form { } } 

Después de reasignar BackendObject al final (es mejor separar el archivo), la limpieza del proyecto + la reconstrucción resolvió el problema.

Resolví esto yendo al proyecto donde se guardó mi archivo de recursos, desplazándome hacia abajo a su ItemGroup y agregando un nombre lógico que correspondía a la ruta que el comstackdor esperaba.

Mi EmbeddedResource se veía así:

    PublicResXFileCodeGenerator TextResources.Designer.cs   

Ahora parece que esto

    PublicResXFileCodeGenerator TextResources.Designer.cs MyProject.Properties.Resources.resources   

El hecho de que esté haciendo referencia a la DLL del Proyecto B no significa que el Administrador de Recursos del Proyecto A conozca el directorio App_GlobalResources del Proyecto B.

¿Estás utilizando proyectos de sitios web o proyectos de aplicaciones web? En este último, Visual Studio debería permitirle vincular los archivos de código fuente (no estoy seguro acerca de los primeros, nunca los he usado). Esta es una característica poco conocida pero útil, que se describe aquí . De esta forma, puede vincular los archivos de recursos del Proyecto B al Proyecto A.

En mi caso, estas líneas de código añadidas a Web.config ayudaron mucho:

  ...  ...  

Junto con la acción Build: Embedded Resource y herramienta personalizada: PublicResXFileCodeGenerator .

Propiedades de doble clic en la verificación de la sección de la aplicación El nombre del ensamblado y el espacio de nombre predeterminado son los mismos

En mi caso, había colocado una clase nueva encima de un formulario de Windows, dentro del mismo archivo.

Mover la clase recién agregada de ese archivo solucionó el problema.

Vea aquí: http://i.stack.imgur.com/wVu6c.png

Esto puede deberse a espacios de nombres que no coinciden. El segundo de la respuesta superior (Sibi Elango) dice que haga clic derecho en el archivo resx y cambie la opción de comstackción a EmbeddedResource, pero ya lo había hecho y todavía tenía el error. La respuesta principal (CFinck’s) muestra una forma de solucionar esto mediante la edición manual de archivos, sin embargo, tuve este problema en MonoDevelop, y tuve que configurar el espacio de nombres predeterminado al mismo que el archivo cs que estaba llamando para el recurso (el archivo que código contenido como el código a continuación) …

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

Después de configurar el espacio de nombres predeterminado a través de la GUI, la línea de arriba ya no causaba una excepción.

También estaba enfrentando el mismo problema, probé todas las soluciones mencionadas en la respuesta, pero ninguna parecía funcionar. Resultó que durante la comprobación del código a TFS. TFS no registró el archivo Resx que solo verificó en el archivo del diseñador. Así que todos los demás desarrolladores se enfrentaron a este problema mientras corrían en sus máquinas. Comprobando el archivo resx manualmente hizo el truco

Esto también puede ocurrir al colocar una clase sobre la clase principal de winform (Form1, por ejemplo) Puede ver esto cuando mira el diseño, ya que no se representa.

Nadie parece haber mencionado esta solución. Obvio realmente – pero me hizo tropezar por un momento …

El modificador de acceso predeterminado para un nuevo archivo de recursos es Internal (o Friend en VB.Net). Asegúrese de cambiar esto a Public

(en el diseñador de resx hay un menú desplegable en la parte superior para el modificador de acceso)