Eu tenho dois projetos da Web do ASP.NET (ProjectA e ProjectB). Quando a classe no ProjectA está instanciando uma classe do ProjectB que usa um arquivo de recurso Blah.resx, recebo este erro:
Uma exceção do tipo 'System.Resources.MissingManifestResourceException' ocorreu no mscorlib.dll, mas não foi tratada no código do usuário.
Não foi possível encontrar nenhum recurso apropriado para a cultura especificada ou a cultura neutra. Verifique se "Resources.Blah.resources" foi corretamente incorporado ou vinculado ao assembly "App_GlobalResources.sn_flri6" no tempo de compilação ou se todos os assemblies de satélite necessários são carregáveis e totalmente assinados.
O que está causando isso?
Há um artigo no site da Microsoft sobre este http://support.microsoft.com/kb/318603 que sugere:
Para resolver esse problema, mova todas as outras definições de classe para que apareçam após a definição de classe do formulário.
Esta é uma solução para o projeto Windows Forms, não tenho certeza se isso também se aplica a projetos da Web.
fonte
To resolve this problem, move all of the other class definitions so that they appear after the form's class definition.
Isso resolveu o meu problema.GetGlobalResourceObject
Respostas:
Acabei de atingir essa mesma exceção em um projeto WPF. O problema ocorreu em um assembly que recentemente mudamos para outro espaço de nome (
ProblemAssembly.Support
paraProblemAssembly.Controls
). A exceção estava acontecendo ao tentar acessar recursos de um segundo arquivo de recurso que existe no assembly.Acontece que o arquivo de recurso adicional não moveu adequadamente as referências do nome antigo do espaço para nome para o novo nome.
No designer.cs do arquivo de recurso, há uma propriedade estática para obter o ResourceManager. Nesse getter, a string ainda estava se referindo ao antigo namespace. Depois de corrigi-lo no novo espaço para nome, o problema foi resolvido:
deveria ter ficado:
Espero que isso ajude a próxima pessoa.
fonte
Eu resolvi o problema assim:
Funciona perfeitamente.
fonte
Quando tentei compartilhar um arquivo resource.resx de um projeto C # com outro projeto C #, obtive esse problema. A sugestão de mover a classe Form para o início de seu arquivo não era apropriada. Foi assim que eu resolvi. Você basicamente usa um link do segundo projeto para o primeiro e ativa a regeneração do
resource.designer.cs
arquivo.Properties/Resources.resx
arquivo do segundo projetoProperties/Resources.resx
arquivo do primeiro projeto como um LINK à pasta Propriedades no segundo projeto. Não o adicione ao nível raiz do projeto.Properties/Resources.designer.cs
!Resources.resx
, adicioneResXFileCodeGenerator
como CustomToolResources.resx
e selecione "Executar ferramenta personalizada". Isso irá gerar um novo arquivo designer.cs.Nota: Evitaria editar o arquivo resource.designer.cs, pois isso é gerado automaticamente.
fonte
No meu caso, uma série de substituições de texto globais mal pensadas alteraram inadvertidamente essa linha no arquivo cs do designer de recursos.
Como o espaço para nome nesse argumento não correspondia mais ao espaço para nome da classe, o aplicativo ficou confuso em tempo de execução.
Verifique se o espaço para nome do designer corresponde ao argumento da string nessa linha.
fonte
Isso acontece porque o
*.resх
é excluído da migração.fonte
Descobri que excluir o arquivo designer.cs, excluir o arquivo resx do projeto e incluí-lo novamente, geralmente corrigia esse tipo de problema, após uma refatoração de espaço para nome (conforme resposta do CFinck)
fonte
Ninguém parece ter mencionado essa solução. Óbvio realmente - mas me tropeçou por um momento ...
O modificador de acesso padrão para um novo arquivo de recursos é
Internal
(ouFriend
no VB.Net.) Certifique-se de alterar isso paraPublic
(no designer resx, há uma lista suspensa na parte superior do modificador de acesso)
fonte
A resposta de Sibi Elangos sozinha não foi suficiente para mim, então eu tive que
Isso irá gerar um App_GlobalResources na sua
/bin
pasta, agora copie essa pasta também para a raiz do aplicativo Webfonte
No meu caso, o problema causado pela definição de classe da maneira errada:
Depois de realocar
BackendObject
para o final (melhor separar o arquivo), a limpeza do projeto + a reconstrução resolveram o problema.fonte
Resolvi isso indo para o projeto em que meu arquivo de recursos foi salvo, rolando para baixo até o ItemGroup e adicionando um nome lógico que correspondia ao caminho que o compilador esperava.
Meu EmbeddedResource ficou assim:
Agora parece com isso
fonte
No que diz respeito a este caso, verifique se o assembly que contém recursos possui o espaço para nome padrão definido como o mesmo texto (Projeto-> Propriedades-> Espaço para nome padrão; no VS) Verifique também se o arquivo resx tem uma propriedade BuildAction definida como "Embedded recurso "Aproveite ...;)
fonte
Assembly localisationAssembly = Assembly.Load("xxx"); ResourceManager resourceManager = new ResourceManager("xxx", localisationAssembly);
Uma abordagem seria colocar as classes / recursos compartilhados em um projeto separado da biblioteca de classes e encaminhá-los para os dois sites.
fonte
Obrigado @CFinck! Apenas para adicionar uma dica a outras pessoas: alterei a linha ResourceManager com esta:
Estou no vb.net, mas acho que em C # a única diferença seria + em vez de & para concatenar seqüências de caracteres.
Dessa forma, posso usar os mesmos arquivos de montagem vinculados em dois projetos semelhantes que compartilham os recursos.
fonte
Esse erro também é gerado pelo Dotfuscation, pois um arquivo de designer resx depende de reflexão. Se você estiver usando o Dotfuscator, ele quebrará seus arquivos resx. Você sempre deve adicioná-los como uma exclusão do processo de ofuscação.
fonte
Quando estávamos usando
Isso geraria esse erro, a menos que agrupássemos a chamada em uma instrução try / catch.
fonte
Eu tenho um aplicativo WinForms com um único projeto na solução.
Segmentação
.NET Framework 4.0
usando
SharpDevelop 4.3
como meu IDEParece bobo, mas aconteceu que eu tinha a
Logical Name
propriedade definida"Resources"
no meu"Resources.resx"
arquivo. Depois que limpei a propriedade, tudo funcionou bem.Normalmente, quando você adiciona arquivos aleatórios como
EmbeddedResource
, geralmente deseja definirLogical Name
algo como razoável, por algum motivo, fiz o mesmo noResources.resx
arquivo e isso estragou tudo ...Espero que isso ajude alguém.
fonte
Para mim, o problema era copiar arquivos .resx e arquivos .cs associados de um projeto para outro. Ambos os projetos tinham o mesmo espaço para nome, então esse não era o problema.
Finalmente resolvi quando notei no Solution Explorer que no projeto original os arquivos .resx eram dependentes dos arquivos .cs:
Enquanto no projeto copiado, os arquivos .cs dependiam dos arquivos .resx:
Aconteceu que, no segundo projeto, os arquivos .resx foram configurados para gerar automaticamente os arquivos .cs. Os arquivos .cs gerados automaticamente estavam substituindo os arquivos .cs copiados do projeto original.
Para corrigir o problema, edite as propriedades de cada arquivo .resx no projeto copiado. A propriedade Custom Tool será definida como algo como ResXFileCodeGenerator . Limpe a propriedade Custom Tool do arquivo .resx. Você precisará copiar novamente o arquivo .cs do projeto original, pois ele será substituído pelo arquivo gerado automaticamente.
fonte
No meu caso, eu havia colocado uma nova classe em cima de um formulário do Windows, dentro do mesmo arquivo.
Mover a classe recém-adicionada desse arquivo corrigiu o problema.
Veja aqui: http://i.stack.imgur.com/wVu6c.png
fonte
Isso pode ser causado por namespaces incompatíveis. A segunda da resposta superior (da Sibi Elango) diz para clicar com o botão direito do mouse no arquivo resx e alterar a opção Build para EmbeddedResource, mas eu já tinha feito isso e ainda tinha o erro. A resposta superior (CFinck's) indica uma maneira de corrigir isso através da edição manual de arquivos; no entanto, eu tive esse problema no MonoDevelop e tive que definir o espaço de nome padrão como o arquivo cs que estava chamando o recurso (o arquivo que código contido, como o código abaixo) ...
Após definir o espaço para nome padrão por meio da GUI, a linha acima não causou mais uma exceção.
fonte
Apenas outro caso. Copiei uma solução com dois projetos e os renomeei parcialmente no Windows Explorer (nomes de pastas, nomes de arquivo .sln e .csproj) e parcialmente com uma ação maciça de Localizar e substituir no Visual Studio (espaços de nome etc.). No entanto, a exceção declarada pelo OP ainda ocorreu. Descobri que os nomes de Assembly e Namespace ainda eram antigos.
Embora o projeto e todo o resto já tenham sido nomeados OfficeStyle o
Assembly name
eDefault namespace
ainda foram nomeados Linckus .Após essa correção, tudo funcionou bem novamente, compile e execute o tempo :)
fonte
No meu caso, essas linhas de código adicionadas
Web.config
ajudaram bastante:Juntamente com ação de compilação:
Embedded Resource
e Custom Tool:PublicResXFileCodeGenerator
.fonte
As propriedades Double Click na seção Application marque Nome do assembly e espaço para nome padrão são os mesmos
fonte
Eu também estava enfrentando o mesmo problema, tentei todas as soluções mencionadas na resposta, mas nenhuma parecia funcionar. Aconteceu que durante o check-in do código para o TFS. O TFS não fez check-in no arquivo Resx, apenas fez check-in no arquivo de designer. Portanto, todos os outros desenvolvedores estavam enfrentando esse problema enquanto rodavam em suas máquinas. Verificar o arquivo resx manualmente fez o truque
fonte
Isso também pode ocorrer ao colocar uma classe acima da classe principal do winform (Form1, por exemplo). Você pode ver isso quando olha para o design, pois ele não é renderizado.
fonte
Outra causa: se o seu espaço para nome tiver um hífen ("-"), ele será criado e executado corretamente, mas o recurso não estará acessível. Os espaços para nome (identificadores) não devem ter hífens, mas isso não parece ser imposto em nenhum lugar, exceto no carregamento de recursos. Isso me queimou duas vezes ao longo da década.
fonte
Outra coisa a verificar é se você tem LogicalName ou ManifestResourceName definido no EmbeddedResource. Certifique-se de que elas estejam definidas adequadamente se o arquivo do projeto as estiver usando, pois elas podem fazer com que os recursos permaneçam com um nome que você não está esperando.
fonte
Eu enfrentei esse problema ao executar o comando de migração.
Update-Database
no console do Package Manager.A resposta aceita não resolveu meu problema.
Eu tive que mudar o Build Action de
Compile
paraEmbedded Resource
e funcionou para mim.Você pode fazer o mesmo usando as etapas abaixo:
fonte
Para usuários que enfrentam esse problema no .NET Core 3.0, isso pode estar relacionado a uma alteração de última hora feita no .NET Core 3.0, para resolvê-lo apenas definido
EmbeddedResourceUseDependentUponConvention
como falso no seu projeto csproj:fonte
Clique com o botão direito do mouse nos recursos e selecione
Run Custom Tool
Isso corrigirá o designer
fonte
Só porque você está fazendo referência à DLL do Projeto B não significa que o Gerenciador de Recursos do Projeto A esteja ciente do diretório App_GlobalResources do Projeto B.
Você está usando projetos de sites ou aplicativos de web? No último, o Visual Studio deve permitir que você vincule arquivos de código-fonte (não tenho certeza sobre o primeiro, nunca os usei). Este é um recurso pouco conhecido, mas útil, descrito aqui . Dessa forma, você pode vincular os arquivos de recurso do Projeto B ao Projeto A.
fonte