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

194

Tengo dos proyectos web ASP.NET (ProjectA y ProjectB). Cuando la clase en ProjectA está instanciando 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é correctamente incrustado o vinculado en el ensamblado "App_GlobalResources.sn_flri6" en el momento de la compilación, o que todos los ensambles de satélite necesarios se puedan cargar y estén totalmente 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 demás 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 los proyectos web.

desarrollador
fuente
¿Qué tipo de proyectos son estos? 2 sitios web? 1 sitio web, 1 biblioteca de clase?
Ruddy
Dos proyectos de sitio web ASP.NET.
dev.e.loper
11
+1 para To resolve this problem, move all of the other class definitions so that they appear after the form's class definition.Esto resolvió mi problema.
OmarOthman
1
Haga +1 en la definición de sus preguntas con el enlace de Ayuda de Microsoft Project.Forms de Windows para solucionar mi problema.
DarrenMB
¡Esta respuesta resolvió el problema para mí! GetGlobalResourceObject
DanielV

Respuestas:

257

Acabo de llegar a esta misma excepción en un proyecto WPF. El problema ocurrió dentro de un ensamblaje que recientemente movimos a otro espacio de nombres ( ProblemAssembly.Supporta ProblemAssembly.Controls). La excepción ocurría al intentar acceder a los recursos desde 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 de espacio de nombres al nuevo nombre de espacio de nombres.

En el archivo designer.cs para el archivo de recursos, hay una propiedad estática para obtener el ResourceManager. Dentro de ese captador, la cadena todavía se refería al antiguo espacio de nombres. Una vez que lo corrigió al 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.

CFinck
fuente
55
+1 Buena explicación de dónde ubicar la causa en el archivo del diseñador. Encontrado y solucionado el mismo problema gracias a usted :)
Gone Coding
1
enlace: documentación de MSDN para la clase ResourceManager .
Boinst
3
Gracias, me ayudó a resolver este problema. También se puede eliminar el archivo del diseñador, luego abrir y luego guardar el archivo resx para volver a generar el archivo del diseñador correctamente.
Serge
1
Tuve el mismo problema y esta fue la respuesta que estaba buscando. Lamentablemente no aparece en el momento de la compilación :-( Gracias
noob
2
gracias también tuvo este problema, pero fue porque agregué una subcarpeta con el mismo nombre que la última parte del espacio de nombres del proyecto, por lo que estaba buscando project.folder.folder.class en lugar de project.folder.class. ¡Lo moví a la raíz y ahora se alinea y funciona!
SelAromDotNet
115

Resolví el problema así:

  1. Haga clic derecho en su archivo de recursos
  2. Cambie la propiedad "Build Action" Compile a "Embedded Resource"
  3. Luego construye y corre

Funciona perfectamente

Sibi Elango
fuente
@sibi Elango Hago clic derecho en mi ResourceFile pero no puedo encontrar la parte Build Action.
S5498658
1
@ S5498658 Si no ve esto en el menú contextual (clic derecho), busque en el panel Propiedades (generalmente ubicado debajo del explorador de soluciones).
define el
Su acción de construcción pero aún no funciona. También verifiqué el directorio y el directorio es el mismo en propiedades.
albatros
1
Sería genial si la respuesta explica por qué funciona esta solución.
Luis Teijon
esto es simplemente increíble
code4j
22

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 comienzo 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 resource.designer.csarchivo.

  1. Eliminar el Properties/Resources.resxarchivo del segundo proyecto
  2. Agregue el Properties/Resources.resxarchivo del primer proyecto como un ENLACE a la carpeta Propiedades en el segundo proyecto. No lo agregue al nivel raíz del proyecto.
  3. ¡No agregue el primer proyecto Properties/Resources.designer.cs!
  4. En las propiedades del segundo proyecto Resources.resx, agregue ResXFileCodeGeneratorcomo CustomTool
  5. Haga clic derecho en Resources.resxy seleccione "Ejecutar herramienta personalizada". Esto generará un nuevo archivo designer.cs.

Nota: Evitaría editar el archivo resource.designer.cs, ya que esto se genera automáticamente.

Mark Lakata
fuente
12

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.

ingrese la descripción de la imagen aquí

Como 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.

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

cockypup
fuente
1
Fue exactamente mi problema. ¡Gracias por compartir!
AcidJunkie
Lo mismo aquí: sucedió después de migrar de PCL a .NET Standard, cuando creé un proyecto temporal y un espacio de nombres, en el que copié todos los archivos portátiles, eliminé el proyecto portátil y volví el espacio de nombres al original, esta línea todavía contenía el temporal espacio de nombres del proceso de migración.
Zerga
11

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

  • Haga clic derecho en su archivo de recursos
  • Haga clic en el elemento del menú "Incluir en proyecto"
usuario1919359
fuente
2
Esto me lo arregló. Normalmente, el archivo resx se agrega automáticamente. Hice una fusión en la que tuve que cambiar el archivo del proyecto y agregar las migraciones manualmente, así que tal vez eso tuvo algo que ver con eso
Smarty
Trabajó para mi. Tengo que agregar todos los archivos * .resx de cada migración. Gracias
m.rufca
7

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

Stephen Drew
fuente
¡Esto es lo que hizo por mí! (probé la respuesta de CFinck porque parecía relevante, pero no funcionó)
winwaed
De hecho, una de las soluciones más rápidas
Lorenz Lo Sauer
6

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 Frienden VB.Net.) Asegúrese de cambiar esto aPublic

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

James S
fuente
4

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

  • Haga clic derecho en su archivo de recursos
  • Cambiar la propiedad "Crear acción"
  • Compilar a "recurso integrado"
  • Construir y desplegar

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

AlexanderD
fuente
4

En mi caso, el problema causado por definir 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 BackendObjecthasta el final (mejor separar el archivo), hacer la limpieza del proyecto + reconstruir resolvió el problema.

Jawad Al Shaikh
fuente
1
Wow, no sabía que tener una clase incorrecta al comienzo del archivo rompería las cosas tan mal.
BrainStorm.exe
4

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 esperaba el compilador.

Mi EmbeddedResource se veía así:

   <ItemGroup>
    <EmbeddedResource Update="Properties\TextResources.resx">
      <Generator>PublicResXFileCodeGenerator</Generator>
      <LastGenOutput>TextResources.Designer.cs</LastGenOutput>
    </EmbeddedResource>
  </ItemGroup>

Ahora se ve así

  <ItemGroup>
    <EmbeddedResource Update="Properties\TextResources.resx">
      <Generator>PublicResXFileCodeGenerator</Generator>
      <LastGenOutput>TextResources.Designer.cs</LastGenOutput>
      <LogicalName>MyProject.Properties.Resources.resources</LogicalName>
    </EmbeddedResource>
  </ItemGroup>
Juansero29
fuente
3

En lo que respecta a este caso, verifique si el ensamblado que contiene recursos tiene el espacio de nombres predeterminado establecido en el mismo texto (Proyecto-> Propiedades-> Espacio de nombres predeterminado; en VS) Compruebe también si el archivo resx tiene una propiedad BuildAction establecida en "Embedded recurso "Disfruta ...;)

Mohammad Fazeli
fuente
1
Hola, ¿quieres decir que el texto del espacio de nombres predeterminado (xxx) debe ser el mismo que en el código: Assembly localisationAssembly = Assembly.Load("xxx"); ResourceManager resourceManager = new ResourceManager("xxx", localisationAssembly);
DanielV
2

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

Subbu
fuente
2
Seguramente este es el mismo problema, ¿no?
Brett Rigby
2

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 manera, puedo usar los mismos archivos de ensamblaje vinculados en dos proyectos similares que comparten los recursos.

Mathieu Leblanc
fuente
1

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

Trevor Elliott
fuente
1

Cuando estábamos usando

HttpContext.GetGlobalResourceObject()

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

jmb_coder
fuente
1

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

Suena tonto, pero resultó que tenía la Logical Namepropiedad establecida "Resources"en mi "Resources.resx"archivo. Una vez que despejé esa propiedad, todo funciona hunky-dory.

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

Espero que esto ayude a alguien.

nurchi
fuente
Parecía tener esto también. Un conflicto de nombres, supongo, ¡buen hallazgo!
Trent
1

Para mí, el problema era 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 el Explorador de soluciones que en el proyecto original los archivos .resx dependían de los archivos .cs:

MyResource.cs
|_ MyResource.resx

Mientras que 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 se habían configurado para generar automáticamente los archivos .cs. Los archivos .cs generados automáticamente 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. Deberá volver a copiar el archivo .cs del proyecto original, ya que el archivo generado automáticamente lo ha sobrescrito.

Simon Tewsi
fuente
1

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

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

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

Petre
fuente
1
¡Bienvenido a Stackoverflow! Si tiene código para compartir con nosotros, no lo publique como imagen. Puede agregarlo a su publicación y formatearlo como código .
FelixSFD
Gracias @FelixSFD por la sugerencia
Petre
1

Esto puede ser causado por espacios de nombres no coincidentes. El segundo de la respuesta principal (Sibi Elango) dice que haga clic derecho en el archivo resx y cambie la opción de compilación a EmbeddedResource, pero ya lo había hecho y todavía tenía el error. La respuesta principal (CFinck) señala una forma de solucionar esto mediante la edición manual de archivos, sin embargo, tuve este problema en MonoDevelop y tuve que establecer el espacio de nombres predeterminado al mismo que el archivo cs que estaba solicitando 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 anterior ya no causó una excepción.

Poikilos
fuente
1

Solo otro caso. Copié una solución con dos proyectos y los renombré parcialmente en el explorador de Windows (nombres de carpeta, nombres de archivo .sln y .csproj) y parcialmente con una acción masiva de Buscar y reemplazar en Visual Studio (espacios de nombres, etc.). Sin embargo, la excepción declarada por el OP todavía ocurrió. Descubrí que los nombres de la Asamblea y el Espacio de nombres todavía eran viejos.

Aunque el proyecto y todo lo demás que ya fue nombrado OfficeStyle el Assembly namey Default namespacetodavía fueron nombrados Linckus .

Vieja situacion

Después de esta corrección, todo volvió a funcionar, compilar y ejecutar :)

Nueva situacion

Bernoulli IT
fuente
0

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

<system.web>
     ...
    <globalization uiCulture="cs" culture="cs-CZ" />
     ...
<system.web>

Junto con la acción de construcción: Embedded Resourcey la herramienta de medida: PublicResXFileCodeGenerator.

m_david
fuente
0

Haga doble clic en las propiedades en la sección Aplicación, verifique que el nombre del ensamblaje y el espacio de nombres predeterminado sean iguales

DevC
fuente
0

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

Kayani
fuente
¿Qué quiere decir con "registrarse"?
Fandango68
Empujando el archivo a TFS
Kayani
0

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

williamw
fuente
0

Otra causa más: si su espacio de nombres tiene un guión ("-"), se generará y ejecutará correctamente, pero el recurso no será accesible. Se supone que los espacios de nombres (identificadores) no tienen guiones, pero parece que esto no se aplica en ninguna parte excepto en la carga de recursos. Esto me ha quemado dos veces durante la década.

beanmf
fuente
0

Otra cosa que debe verificar es si tiene LogicalName o ManifestResourceName definido en EmbeddedResource. Asegúrese de que estén definidos adecuadamente si su archivo de proyecto los está utilizando, ya que pueden hacer que los recursos vivan bajo un nombre que no espera.

David Engel
fuente
0

Me enfrenté a este problema para ejecutar el comando de migración.Update-Databaseen la consola de Package Manager.

La respuesta aceptada no resolvió mi problema.

Tuve que cambiar Build Action de CompileaEmbedded Resource y funcionó para mí.

Puede hacer lo mismo con los pasos a continuación:

  1. Haga clic derecho en la migración.
  2. Cambie la propiedad "Compilar acción" "Compilar" a "Recurso integrado"
  3. Ejecute el comando Update-Database.
immirza
fuente
0

Para los usuarios que enfrentan este problema en .NET Core 3.0, esto podría estar relacionado con un cambio importante que se realizó en .NET Core 3.0, para resolverlo, simplemente EmbeddedResourceUseDependentUponConventionconfigúrelo como falso en su proyecto csproj:

<PropertyGroup>
  <EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention>
</PropertyGroup>
Soheil Alizadeh
fuente
0

Haga clic derecho en los recursos y seleccione Run Custom Tool

Esto arreglará al diseñador

Michele Bortot
fuente
-1

El hecho de que haga 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á utilizando proyectos de sitios web o proyectos de aplicaciones web? En el último, Visual Studio debería permitirle vincular archivos de código fuente (no estoy seguro sobre el primero, nunca los he usado). Esta es una característica poco conocida pero útil, que se describe aquí . De esa manera, puede vincular los archivos de recursos del Proyecto B al Proyecto A.

Heinzi
fuente