O que significa MissingManifestResourceException e como corrigi-lo?

151

A situação:

  • Eu tenho uma biblioteca de classes, chamada RT.Servers, contendo alguns recursos (do tipo byte[], mas não acho importante)
  • A mesma biblioteca de classes contém um método que retorna um desses recursos
  • Eu tenho um programa simples (com uma referência a essa biblioteca) que chama apenas esse método único

Recebo um MissingManifestResourceExceptioncom a seguinte mensagem:

Não foi possível encontrar nenhum recurso apropriado para a cultura especificada ou a cultura neutra. Verifique se "Servers.Resources.resources" foi corretamente incorporado ou vinculado ao assembly "RT.Servers" em tempo de compilação ou se todos os assemblies de satélite necessários são carregáveis ​​e totalmente assinados.

Eu nunca brinquei com culturas ou com assinaturas de assembléias, então não sei o que está acontecendo aqui. Além disso, isso funciona em outro projeto que usa a mesma biblioteca. Alguma ideia?

Timwi
fonte
2
Essa é uma das exceções mais inúteis do .NET. Ele dispara em pelo menos três cenários que não compartilham nada em comum.
RR
1
Desculpe, mas é uma maneira da Microsoft: remova tudo e adicione novamente . Trabalha para recursos, NUGET, referências e cadeias de conexão. Há uma série de ferramentas, mas você passou um tempo para os arquivos raw em casos não-usuais ...
maxkoryukov

Respostas:

238

Tudo o que eu precisava para corrigir esse problema foi clicar com o botão direito do mouse no Resources.resxarquivo no Gerenciador de Soluções e clicar em Executar Ferramenta Personalizada . Isso gera novamente o Resources.Designer.csarquivo gerado automaticamente.

Se o arquivo .resx foi adicionado ao projeto manualmente, a propriedade Custom Tool do arquivo deve ser definida como "ResXFileCodeGenerator".

O problema ocorre devido a uma incompatibilidade de namespaces, que ocorre se você alterar o "namespace padrão" da montagem nas configurações do projeto. (Eu mudei de (anteriormente) "Servers"para (agora) "RT.Servers".)

No código gerado automaticamente Resources.Designer.cs, há o seguinte 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;
    }
}

A cadeia literal "Servers.Resources"teve que ser alterada para "RT.Servers.Resources". Fiz isso manualmente, mas a execução da ferramenta personalizada teria feito igualmente bem.

Timwi
fonte
9
Isso me salvou muito tempo!
Eric
1
+1! No VS 2010, a cadeia literal do ResourceManager mostrada acima é atualizada automaticamente para o valor do Namespace Padrão nas propriedades do projeto (guia Aplicativo), pelo menos para WinForms.
TrueWill
2
E se você não tiver um arquivo resources.resx?
ashes999
@ ashes999: Você procurou na pasta Propriedades? É aí que geralmente é para projetos C # pelo menos.
precisa saber é o seguinte
Eu executei o mesmo problema. arquivo .resx posterior. como posso fazer isso ....
Kavitha
37

Encontrei este problema hoje e encontrei esta página de Ajuda e Suporte da Microsoft que realmente solucionou o problema.

Eu tinha alguns delegados no topo do meu arquivo, no espaço de nomes global, e de repente eu estava recebendo um MissingManifestResourceExceptionao executar o programa, nesta linha:

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

Então mudei os delegados para o espaço de nome, obtive o mesmo erro. Finalmente, coloquei os delegados na única classe nesse arquivo e o erro desapareceu, mas eu não queria os delegados nessa classe ou espaço de nome.

Então me deparei com o link acima, que dizia

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.

Coloquei os delegados (que eu não consideraria "definições de classe") na parte inferior desse arquivo, fora do espaço de nomes local, e o programa não conseguiu MissingManifestResourceExceptionmais. Que erro irritante. Mas isso parece uma solução mais robusta do que modificar o código gerado automaticamente :)

Mark Rushakoff
fonte
Obrigado pela sua resposta. Parece que você teve um problema diferente que causou o mesmo sintoma. Eu não tinha nenhuma classe extra no meu código, na verdade nem sequer tinha nenhum formulário. Devo editar minha resposta anterior porque descobri que não precisava modificar o código gerado automaticamente. Eu poderia apenas executar novamente o gerador de código, e ele teria se consertado. Não faço ideia por que o processo de compilação não o fez automaticamente.
Timwi 5/09/09
7
Eu recebi o erro devido à adição de uma classe acima da classe do formulário no arquivo Form1.cs (conforme discutido na seção "Resolução" do link que você forneceu). Obrigado!
Matt Smith
Mesmo problema; nada mais estava funcionando, então apenas excluí a linha: this.Icon = ((System.Drawing.Icon) (resources.GetObject ("$ this.Icon"))); Porque eu não me importo com o ícone em que forma particular :)
Gary Huckabone
Essa é a resposta. Obrigado.
Sertan Pekel
Se anyones confuso eu tinha uma classe chamada "StringExtensions" antes "Form1" bit dos Form1.cs, eu mover-lo abaixo Form1 no Form1.cs em vez de acima e funcionou
Ma Cara
31

Eu deparei com um problema semelhante e, embora eu saiba que não é a causa do OP, publicarei aqui para que, se alguém resolver esse problema no futuro, uma resposta esteja disponível.

Se você adicionar uma classe antes da classe designer, receberá uma MissingManifestResourceExceptionexceção em tempo de execução (sem erro ou aviso em tempo de compilação) porque

O Visual Studio requer que os designers usem a primeira classe no arquivo.

Para (ligeiramente) mais informações, consulte este post .

Motti
fonte
12
Obrigado por postar esta "resposta". Apesar de estar "fora de tópico" em relação ao problema do OP, foi uma boa ideia publicá-lo aqui. Uma pesquisa por MissingManifestResourceException me levou a esse segmento, e sua resposta foi imediata para o meu problema.
RenniePet
16

Eu tive o mesmo problema, mas o uso do comando Executar ferramenta personalizada, conforme sugerido por Timwi , não ajudou no meu caso.

No entanto, ele me levou na direção certa, porque acabei nas propriedades do arquivo .resx . Aqui notei uma diferença em outro arquivo .resx que não causou problemas.

No meu caso, tive que alterar a propriedade "Build Action" de "Resource" para "Embedded Resource".

Meu melhor palpite pelo motivo é que eu tinha o. Resx em uma biblioteca que foi usada em outro aplicativo. Meu aplicativo não tinha seu próprio arquivo .resx , portanto, ele teve que usar o da biblioteca - que só está disponível quando incorporado na biblioteca e não "autônomo".

BlaM
fonte
2
Com +1, verifiquei meus arquivos de recursos, que também estão em uma biblioteca separada, referenciada por outros aplicativos. Eu tinha o Build Action definido como Content e, depois de alterá-lo para Embedded Resource, tudo funcionou bem. Supervisão
tola
1
Obrigado! Isso funcionou para mim, onde eu tinha alguns arquivos de texto contendo conteúdo para teste ou algumas regras de mapeamento de negócios. A alteração do conteúdo para o recurso incorporado corrigiu o problema.
quer
12

Quando executo um problema semelhante, no Vs 2012, verifica-se que a propriedade "Custom Tool Namespace" do arquivo resx estava incorreta (no meu caso, na verdade, não estava definida, portanto o código gerado gerou essa exceção em tempo de execução) . Meu conjunto final de propriedades para o arquivo resx era algo como isto:

  • Ação de criação : Recurso Incorporado
  • Copiar para o diretório de saída: não copie
  • Ferramenta personalizada: ResXFileCodeGenerator
  • Espaço para nome da ferramenta personalizada: My.Project.S.Proper.Namespace
Starnuto di topo
fonte
3

Consulte também: MissingManifestResourceException ao executar testes após criar com o MSBuild (.mresource possui caminho no manifesto)

Repito a resposta aqui apenas para completar:

Parece que adicionar LogicalName ao arquivo do projeto o corrige:

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

ou seja, a entrada do recurso incorporado no arquivo do projeto se parece com isso:

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

Isso está detalhado em: http://blogs.msdn.com/b/msbuild/archive/2007/10/19/manifest-resource-names-changed-for-resources-files.aspx

Observe que estamos usando um arquivo .resx, mas o bug ainda parece ocorrer.

Atualização: O problema com os recursos (incluindo XAML) parece estar relacionado aos caminhos de saída e ao uso de barras para frente ou para trás, conforme detalhado em: Por que a modificação dos diretórios de saída do projeto causa: IOException não foi tratado "Não é possível localizar o recurso 'app.xaml' . "

nietras
fonte
Após cerca de oito horas depurando esse problema e literalmente vasculhando cada resposta do github, SO e Google, essa é a resposta que resolveu meu problema ... fwiw, meu problema começou a acontecer após a migração do .Net 3.5 para 4.7.2.
Neville
3

Encontrei uma causa diferente desse problema, que não estava relacionada aos arquivos resx. Eu tinha uma biblioteca de classes em que AssemblyInfo.cs continha o seguinte:

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

O assembly não continha nenhum código WPF, tema ou dicionários de recursos. Eu me livrei da exceção removendo o atributo ThemeInfo.

Eu não recebi uma exceção real, apenas

Uma exceção de primeira chance do tipo 'System.Resources.MissingManifestResourceException'.

Vendo detalhes da exceção, o sistema estava solicitando MyAssembly.g.resources

Espero que isso possa ser útil para outra pessoa.

pé Grande
fonte
2
Obrigado por isso! Exatamente a correção que eu precisava! Acontece quando você acidentalmente cria um projeto ViewModel como uma biblioteca de Controle.
Andrew Hanlon 29/11
Obrigado. Isso consertou para mim.
Jamleck
2

Não tenho certeza se isso ajudará as pessoas, mas esta funcionou para mim:

Portanto, o problema que tive foi que eu estava recebendo a seguinte mensagem:

Não foi possível encontrar nenhum recurso apropriado para a cultura especificada ou a cultura neutra. Verifique se "My.Resources.Resources.resources" foi corretamente incorporado ou vinculado ao assembly "X" em tempo de compilação ou se todos os assemblies de satélite necessários são carregáveis ​​e totalmente assinados "

Eu estava tentando obter os recursos incorporados no meu projeto a partir de outra biblioteca de classes.

O que fiz para corrigir o problema foi definir o Modificador de Acesso na guia Projeto-> Propriedades-> Recursos de "Interno" (acessível apenas na mesma biblioteca de classes) para "Público" (acessível em outra biblioteca de classes)

Então corra e voilà, não há mais erro para mim ...

codingismylife
fonte
2

A solução dada pelo BlaM também funcionou para mim.

Eu sou um usuário do VS 2013. Depois de passar por muitas correções, mas sem sorte, tentei o seguinte:

  1. Clique com o botão direito do mouse no arquivo de recurso, um por um, no caso de vários arquivos.
  2. Verifique se a propriedade "Build Action" está definida como "Embedded Resource".

É isso aí! :)

Jiten
fonte
Confirmando isso. Eu tenho um projeto funcional, mas precisava manter os assemblies de recursos separadamente, então tentei mudar de "Embedded Resource" para simplesmente "Resource" e acabei recebendo o MissingResourceManifestException.
Mosca Pt
2

Eu tive o mesmo problema, mas no meu caso, coloco uma classe em um usercontrol que está relacionada ao usercontrol como este

Public Class MyUserControlObject

end Class

Public Class MyUserCOntrol

end Class

A solução foi mover MyUserControlObjecto final da classe Usercontrol, assim

Public Class MyUserCOntrol

end Class

Public Class MyUserControlObject

end Class

Eu espero que isso ajude

Smith
fonte
Fale sobre uma descrição de erro ruim ... Eu adicionei uma classe auxiliar ao arquivo CS do formulário principal. Nunca imaginei que a mensagem de erro teria um link para isso. Obrigado!
Adam Lewis
1

Eu estava recebendo o erro MissingManifestResourceException depois de portar meu projeto do VS2005 para o VS2010. Eu não tinha nenhuma outra classe definida no arquivo que contém minha classe Form. E eu também tive meu nome de arquivo de recurso resx definido corretamente. Não funcionou.

Então eu apaguei os arquivos resx e os regenerei. Tudo bem agora.

Winston
fonte
1

Recentemente, tive o mesmo problema, lutou um pouco, encontrei este tópico, mas nenhuma resposta estava correta para mim.

Meu problema foi que, quando removi a janela principal do meu projeto WPF (ele não tem uma janela principal), esqueci de removê StartupUri-lo App.xaml. Eu acho que essa exceção pode acontecer se você tiver um erro no StartupUri, então no caso, se alguém está lutando com isso - verificar o seu StartupUrino App.xaml.

Archeg
fonte
1

Recentemente, deparei com essa questão, no meu caso, fiz algumas coisas:

  1. Verifique se os espaços para nome são consistentes no arquivo Designer.cs do arquivo resx

  2. Verifique se o espaço para nome padrão da montagem (clique com o botão direito do mouse no projeto e escolha Propriedades) está definido da mesma forma que o espaço para nome no qual o arquivo de recursos está.

Depois que eu fiz o passo 2, a exceção foi embora.

stormtrooper
fonte
1

Eu tive esse problema quando adicionei outra classe no arquivo imediatamente antes da classe que derivava do formulário. Adicioná-lo após corrigir o problema.

franckspike
fonte
1

Além disso, o mesmo erro pode ocorrer quando você insere uma nova classe no código-fonte da classe de um formulário criado pelo designer.

Essa nova classe pode ser removida e colocada em um arquivo cs diferente.

(Pelo menos no meu caso, esse era o problema ...)

István Nagy
fonte
0

Porque estou pré-compilando meu aplicativo Web (usando o recurso de publicação do VS2012). Eu estava recebendo o erro acima. Tentei todas as sugestões, mas alterar estranhamente 'Ação de compilação' para 'Conteúdo' fez o truque!

Markive
fonte
0

No meu caso, tenho uma API da Web com recursos e crio um pacote de nuget a partir disso. Quando uso esse nuget em outros projetos, percebo que, quando solicito uma API com recursos, estou pesquisando MissingManifestResourceExceptionum pouco, aprendi que o empacotador de nuget não está empacotando recursos automaticamente. Se você quiser usar arquivos de recursos, precisará fazer isso manualmente. Portanto, você precisa adicionar as linhas abaixo ao seu arquivo .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>

Mas, antes de adicionar arquivos, você precisa ter certeza de qual versão do .net está usando.

dcy
fonte
0

Eu tive o com um projeto F # recém-criado. A solução foi desmarcar "Usar nomes de recursos padrão" nas propriedades do projeto -> Aplicativo -> Recursos / Especifique como os recursos do aplicativo serão gerenciados. Se você não vir a caixa de seleção, atualize seu Visual Studio! Eu tenho 15.6.7 instalado. Na 15.3.2, esta caixa de seleção não existe.

KCT
fonte
0

Apenas para mencionar. Se você usar uma constante ou literal, verifique se ele se refere a um recurso do formulário ProjectName.Resourcese não cpntain Resources.resx.

Pode economizar uma ou duas horas.

Erva
fonte
0

Eu encontrei esse problema com o projeto C ++ gerenciado com base no WinForms após renomear o espaço para nome global (não manualmente, mas com a ferramenta Renomear do VS2017).

A solução é simples, mas não é mencionada em nenhum outro lugar.

Você precisa alterar a RootNamespaceentrada no arquivo vcxproj para corresponder ao espaço para nome C ++.

AntonK
fonte
0

No meu caso, foi um erro de digitação no Xaml de uma janela aberta no Winforms Form:

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

Correto: <Image Source="../Resources/WorkGreen.gif"/> pode ajudar alguém

tretom
fonte
-3

Na página de suporte da Microsoft :

Esse problema ocorre se você usar um recurso localizado que existe em um assembly satélite criado usando um arquivo .resources que possui um nome de arquivo inadequado. Esse problema geralmente ocorre se você criar manualmente um assembly satélite.

Para contornar esse problema, especifique o nome do arquivo .resources ao executar o Resgen.exe. Enquanto você especifica o nome do arquivo .resources, verifique se o nome do arquivo começa com o nome do espaço para nome do seu aplicativo. Por exemplo, execute o seguinte comando no prompt de comando do Microsoft Visual Studio .NET para criar um arquivo .resources que tenha o nome do espaço para nome do seu aplicativo no início do nome do arquivo:

Resgen strings.CultureIdentifier.resx 
MyApp.strings.CultureIdentifier.resources
TheVillageIdiot
fonte
1
Obrigado pela sua resposta, mas não sei o que é o ResGen.exe, nunca o usei e, francamente, não quero usá-lo porque não estou tentando usar nada sofisticado. Certamente deve haver uma maneira de corrigir isso no Visual Studio? Por exemplo, como você diz que o recurso está "localizado", como declaro um recurso como não localizado? Obrigado novamente.
Timwi 25/08/09