Mensagem de erro 'Não foi possível carregar um ou mais dos tipos solicitados. Recupere a propriedade LoaderExceptions para obter mais informações. '

347

Desenvolvi um aplicativo usando o Entity Framework , SQL Server 2000, Visual Studio 2008 e Enterprise Library.

Funciona absolutamente bem localmente, mas quando implanto o projeto em nosso ambiente de teste, estou recebendo o seguinte erro:

Não foi possível carregar um ou mais dos tipos solicitados. Recupere a propriedade LoaderExceptions para obter mais informações

Rastreio de pilha: em System.Reflection.Module._GetTypesInternal (StackCrawlMark & ​​stackMark)

em System.Reflection.Assembly.GetTypes ()

em System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.LoadTypesFromAssembly (contexto LoadingContext)

em System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.InternalLoadAssemblyFromCache (contexto LoadingContext)

em System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.LoadAssemblyFromCache (Assembly assembly, Boolean loadReferencedAssemblies, Dictionary 2 knownAssemblies, Dictionary2 & typesInLoading, List`1 & errors)

em System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyFromCache (ObjectItemCollection objectItemCollection, assembly de montagem, Boolean loadReferencedAssemblies)

em System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyForType (Type type)

em System.Data.Metadata.Edm.MetadataWorkspace.LoadAssemblyForType (Tipo de tipo, Assembly chamando Assembly)

em System.Data.Objects.ObjectContext.CreateQuery [T] (String queryString, ObjectParameter [] parâmetros)

O Entity Framework parece ter problema, alguma pista de como corrigi-lo?

A luz
fonte
Não existe uma bala mágica para resolver esse problema, mas esta resposta ajudará você a saber o motivo exato: stackoverflow.com/a/8824250/185022
AZ_

Respostas:

105

Resolvi esse problema definindo como verdadeiro o atributo Copiar local das referências do meu projeto.

Mentoliptus
fonte
33
Quando continuamos pesquisando as exceções internas até ver a exceção do tipo ReflectionTypeLoadException e ela possui uma propriedade "LoaderExceptions" que fornece informações sobre informações de DLL ausentes ou incompatíveis. Então podemos cuidar das ações apropriadas a partir daí.
Sai
19
bem, tudo bem quando você está depurando no Visual Studio. Mas e se o seu aplicativo da Web lançar apenas esse erro no servidor de produção? mesmo depois de definir o atributo Copiar local como true.
Yousi 16/10
2
Esta é uma solução para o problema em um servidor de produção, não em um Visual Studio local. Copiar local copia a DLL referenciada no momento da criação e a DLL é pesquisada primeiro na mesma pasta que o aplicativo em execução. O problema pode persistir se você não copiar a DLL que foi copiada no momento da criação para a pasta correta no servidor de produção.
Mentoliptus 16/10
No meu caso eu tive que adicionar também uma referência NuGet para Microsoft.AspNetCore.Mvc.ViewFeatures
MFedatto
530

Este erro não tem uma resposta verdadeira à bala mágica. A chave é ter todas as informações para entender o problema. Provavelmente, um assembly carregado dinamicamente está ausente de um assembly referenciado. Essa montagem precisa estar no diretório bin do seu aplicativo.

Use este código para determinar o que está faltando.

using System.IO;
using System.Reflection;
using System.Text;

try
{
    //The code that causes the error goes here.
}
catch (ReflectionTypeLoadException ex)
{
    StringBuilder sb = new StringBuilder();
    foreach (Exception exSub in ex.LoaderExceptions)
    {
        sb.AppendLine(exSub.Message);
        FileNotFoundException exFileNotFound = exSub as FileNotFoundException;
        if (exFileNotFound != null)
        {                
            if(!string.IsNullOrEmpty(exFileNotFound.FusionLog))
            {
                sb.AppendLine("Fusion Log:");
                sb.AppendLine(exFileNotFound.FusionLog);
            }
        }
        sb.AppendLine();
    }
    string errorMessage = sb.ToString();
    //Display or log the error based on your application.
}
Ben Gripka
fonte
4
Obrigado! Isso deve fazer parte de qualquer configuração de log em sistemas que usam o MEF.
Bogi lenvig 4/09/14
4
Se eu pudesse upvote cada vez que eu voltar a esta resposta que teria cerca de mais 5 upvotes ... e contagem
sǝɯɐs
2
Você salvou minha vida. Muito obrigado. Eu nunca teria encontrado o problema. Era uma dll antiga que eu não estava mais usando, espreitando profundamente na estrutura do meu projeto e causando esse problema.
Richard
4
só para descobrir rapidamente o que está faltando, use throw new Exception(errorMessage);, a esperança ajuda alguém.
shaijut
2
Sem nenhum código extra, no visual studio, vá para Configurações de exceção e coloque na caixa de pesquisa TypeLoadException e ative as caixas de seleção Acertos de casal. Além disso, você pode ter que desabilitar as opções na seção de depuração "Apenas meu código" para capturar a exceção ao ocorrer em uma dependência que não escreveu.
David Burg
56

Uma solução que funcionou para mim foi excluir as pastas bin / e obj / e reconstruir a solução.

Kenny Eliasson
fonte
Eu tive que recriar o projeto de teste em si, não tenho certeza se você está se referindo ao projeto de teste aqui ou ao projeto que está testando.
precisa saber é o seguinte
4
Outro comentário: Clique com o botão direito do mouse no nó Solução no "Gerenciador de Soluções" e clique em "Limpar Solução", depois clique em "Reconstruir Solução". (Se houver uma nova adição em seu projeto de código-fonte - outros projetos em sua solução - parte (s), isso faz com que as mudanças estão a ser refletida sua pasta de projeto dll e resolve esta questão)
Emre Guldogan
Eu estava tendo esse problema. Conforme sugerido, fechei o Visual Studio, pasta bin excluída, reabri o projeto e a reconstruímos, e foi bem-sucedido.
Sagar S.
Isso estava acontecendo quando eu alternava entre os ramos com alterações significativas. A exclusão da lixeira funcionou. Limpeza e reconstrução NÃO estavam funcionando.
JGTaylor
33

Duas soluções possíveis:

  1. Você está compilando no modo Release, mas implantando uma versão compilada mais antiga do diretório Debug (ou vice-versa).
  2. Você não possui a versão correta do .NET Framework instalada em seu ambiente de teste.
William Edmondson
fonte
Eu tive o mesmo problema, o ponto 1 foi preciso para mim. Obrigado William.
247 Matthew
Eu tenho esse mesmo problema ... Tenho passado por ambas as duas sugestões e ainda receber o mesmo erro :(
David Kiff
Isso também pode acontecer se a sua DLL referenciada estiver "bloqueada". Clique com o botão direito do mouse e selecione "desbloquear"
Ben
3
Também ocorreu que isso acontecesse se um dos projetos DLL estivesse definido para criar "x64" em vez de "Qualquer CPU".
DCastenholz
# 1 pode ocorrer se a configuração de solução é incorrecto - projecto não seleccionado para construir, por exemplo, depois de remover e adicionar novamente o projecto para solução
surfen
13

Como foi mencionado anteriormente, geralmente é o caso de uma assembléia não estar lá.

Para saber exatamente qual assembly está faltando, anexe seu depurador, defina um ponto de interrupção e, quando vir o objeto de exceção, faça uma busca detalhada na propriedade 'LoaderExceptions'. A montagem que falta deve estar lá.

Espero que ajude!

mkorman
fonte
11
Também podemos continuar pesquisando as exceções internas até ver a exceção do tipo ReflectionTypeLoadException e ela possuir uma propriedade "LoaderExceptions", que fornece informações sobre informações de DLL ausentes ou incompatíveis.
Sai
2
Em uma solução com vários projetos, como vemos qual projeto está causando o problema no LoaderExceptions? Vejo que o System.Web.Mvc não pode ser encontrado, mas não sei qual dos 20 projetos nesta solução pode estar com problemas.
Mrcoulson 1/08
9

A solução foi verificar a LoaderException: no meu caso, alguns dos arquivos DLL estavam ausentes.

Digite a descrição da imagem aqui

Dev
fonte
6

Certifique-se de permitir aplicativos de 32 bits no IIS se você implantou no IIS. Você pode definir isso nas configurações do seu pool de aplicativos atual.

MrKhal
fonte
6

Encontrei este erro com um aplicativo ASP.NET 4 + SQL Server 2008 R2 + Entity Framework 4.

Funcionaria bem na minha máquina de desenvolvimento (Windows Vista de 64 bits). Em seguida, quando implantado no servidor ( Windows Server 2008 R2 SP1), funcionaria até o tempo limite da sessão. Então, implantamos o aplicativo e tudo parecia bem e o deixamos por mais de 20 minutos de tempo limite da sessão e esse erro seria gerado.

Para resolvê-lo, usei esse código no blog de Ken Cox para recuperar a propriedade LoaderExceptions.

Para minha situação, a DLL ausente era Microsoft.ReportViewer.ProcessingObjectModel(versão 10). Essa DLL precisa ser instalada no GAC da máquina na qual o aplicativo é executado. Você pode encontrá-lo no Pacote Redistribuível do Microsoft Report Viewer 2010, disponível no site de download da Microsoft.

reitor
fonte
5

Inicialmente, tentei o visualizador de log do Fusion, mas isso não ajudou, então acabei usando o WinDbg com a extensão SOS.

! dumpheap -stat -type Exceção / D

Então examinei o FileNotFoundExceptions. A mensagem na exceção continha o nome da DLL que não estava carregando.

NB, o / D fornece resultados com hiperlink, então clique no link no resumo para FileNotFoundException. Isso exibirá uma lista das exceções. Em seguida, clique no link para uma das exceções. Isso irá despejar essas exceções. Então você deve conseguir clicar no link Mensagem no objeto de exceção e verá o texto.

miko
fonte
4

Minha instância desse problema acabou sendo uma referência ausente. Uma montagem foi referida no app.config, mas não tinha uma referência no projeto.

SteveCav
fonte
3

Se você estiver usando o Entity Framework , tente copiar as seguintes referências localmente.

  • System.Data.Entity
  • System.Web.Entity

Altere a propriedade "Copy Local" para "True" para essas referências e publique.

SameerPc
fonte
3

Outra solução para saber por que exatamente nada funciona (da Microsoft connect):

  1. Adicione este código ao projeto:

    foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
    {
        asm.GetTypes();
    }
  2. Desative os conjuntos de serialização de geração.

  3. Construa e execute.
Siarhei Kuchuk
fonte
2

Eu tinha um aplicativo Web .NET 4.0, ASP.NET MVC 2.0, Entity Framework 4.0 desenvolvido no Visual Studio 2010. Eu tive o mesmo problema, que funcionava em um servidor Windows Server 2008 R2, mas não em outro servidor Windows Server 2008 R2, mesmo que as versões do .NET e ASP.NET MVC fossem as mesmas, gerando esse mesmo erro que o seu.

Fui seguir a sugestão de miko, então instalei o Windows SDK v7.1 (x64) no servidor com falha, para poder executar! Dumpheap.

Bem, acontece que a instalação do Windows SDK v7.1 (x64) resolveu o problema. Qualquer dependência que faltava deve ter sido incluída no SDK. Pode ser baixado do Microsoft Windows SDK para Windows 7 e .NET Framework 4 .

Mafi Osori
fonte
2

Adicionando meu problema / solução específica a isso, pois este é o primeiro resultado dessa mensagem de erro. No meu caso, o erro foi recebido quando implantei um segundo aplicativo na pasta do meu primeiro aplicativo no IIS . Ambos estavam definindo a cadeia de conexão com o mesmo nome, resultando em um conflito entre o aplicativo filho e gerando essa mensagem de erro não óbvia (para mim). Foi resolvido adicionando:

<clear/>

no bloco de cadeias de conexão do aplicativo Web filho, o que impedia que ele herdasse as cadeias de conexão dos arquivos web.config mais altos na hierarquia, para que se pareça com:

<connectionStrings>
  <clear/>
  <add name="DbContext" connectionString="MySERVER" providerName="System.Data.SqlClient" />
</connectionStrings>

Uma pergunta de referência do Stack Overflow que ajudou depois que eu determinei o que estava acontecendo era Um aplicativo filho herdará do seu web.config pai? .

Mateus
fonte
2

Isso funcionou para mim. Adicione-o ao seu web.config

<system.web>
  <trust level="Full" />
Rahul Nikate
fonte
Eu recebi este erro:It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS.
2

Meu problema foi resolvido depois que eu excluí os arquivos de montagem redundantes da binpasta.

user2814851
fonte
2

Caso nenhuma das outras respostas o ajude:

Quando tive esse problema, o serviço do Windows foi criado para uma plataforma x64 e, inadvertidamente, eu estava executando a versão de 32 bits do InstallUtil.exe. Portanto, verifique se você está usando a versão correta do InstallUtil para a plataforma criada.

jkindwall
fonte
Eu tive uma questão semelhante. Algumas das DLLs que meu serviço estava usando foram compiladas para um processador de 32 bits, alteradas para qualquer processador e agora funcionam.
Blake Thingstad 11/11/16
1

Outras sugestões são boas. No meu caso, o problema era que a caixa do desenvolvedor era uma máquina de 64 bits usando o local x86 de várias APIs, incluindo o Silverlight .

Ao alterar a plataforma de destino para corresponder ao servidor de 32 bits em que o aplicativo Web estava sendo implantado, removeu a maioria dos erros relacionados à impossibilidade de carregar um ou mais dos tipos solicitados.

rclopez
fonte
1

Alterei a Propriedade da versão específica das atualizações para false e isso ajudou.

Dov Miller
fonte
1

Eu tive a mesma mensagem de erro relatada ao compilar um pacote do Visual Studio (VSPackage). A solução inteira é compilada e o erro é gerado quando o pacote está sendo criado pelo CreatePkgDef. Dito isto, é claro que não consigo capturar o LoaderExceptions, pois não é meu aplicativo que o lança, mas a própria ferramenta da Microsoft. (Embora eu seja responsável pela confusão de CreatePkgDef.)

No meu caso, a causa principal foi que minha solução cria um MyDll.dll que já foi registrado no GAC (e eles são diferentes); portanto, o CreatePgkDef ficou confuso sobre qual usar e decidiu apenas lançar um erro que não é ' realmente útil. O MyDll.dll no GAC foi registrado pelo instalador do mesmo produto (obviamente uma versão anterior, com conteúdo / ligeiramente / diferente).

Como corrigi-lo

  1. Maneira preferida: Certifique-se de usar a versão correta do MyDll.dll
    1. Ao compilar seu projeto, use um número de versão diferente do usado na versão anterior, localizada no GAC. Verifique se os seguintes atributos estão corretos:
      • [assembly: AssemblyVersion ("1.0.0.1")] // Supondo que o arquivo DLL antigo tenha a versão 1.0.0.0
      • [assembly: AssemblyFileVersion ("1.0.0.1")] // Supondo que o arquivo DLL antigo tenha a versão 1.0.0.0
    2. Se necessário, especifique o nome completo do assembly (por exemplo, "MyDll.dll, Versão = 1.0.0.1, Cultura = neutro, PublicKeyToken = 1234567890abcdef") ao fazer referência a outros projetos.
  2. Se o acima falhou: Você pode desinstalar o MyDll.dll antigo do GAC
    1. Como desinstalar um assembly do GAC
    2. Desinstale o aplicativo que inclui o MyDll.dll

Alterar a AssemblyVersion foi bom o suficiente para mim. :)

Eu espero que isto tenha sido útil.

Shakaron
fonte
1

Eu tive o mesmo problema (mas no meu local) quando estava tentando adicionar a migração do Entity Framework com o Package Manager Console.

A maneira como resolvi foi criando um aplicativo de console em que Main () tinha o seguinte código:

 var dbConfig = new Configuration();
 var dbMigrator = new DbMigrator(dbConfig);
 dbMigrator.Update();

Verifique se a classe Configuration é a configuração de migração do seu projeto com falha. Você precisará System.Data.Entity.Migrations para usar o DbMigrator.

Defina um ponto de interrupção no seu aplicativo e execute-o. A exceção deve ser detectada pelo Visual Studio (a menos que você tenha esse tipo de exceção definido para não interromper a sessão de depuração) e poderá encontrar as informações que está procurando.

A referência que faltava no meu caso era EFProviderWrapperToolkit.

Peter Nagy
fonte
1

Eu tive esse problema quando instalei um pacote NuGet em um dos projetos e esqueci de atualizar o outro projeto.

Eu resolvi isso fazendo apenas os dois projetos com o mesmo conjunto de referência.

jayson.centeno
fonte
Obrigado pelo link! Eu não tinha ideia do que era o NuGet.
jebar8
1

Isso aconteceu comigo também. Resolvi o problema da seguinte maneira: Clique com o botão direito do mouse em Solution, Manage NuGet Packages for Solution ... Consolide pacotes e atualizei os pacotes para que estejam na mesma versão.

user1760527
fonte
0

Defina o modo IIS de 32 bits como true, o modo de depuração como true no arquivo de configuração, a exclusão do tempdiretório e a redefinição do IIS corrigem o problema temporariamente e ele volta depois de algum tempo.

johnny
fonte
0

Verifique se cada um dos seus projetos está configurado corretamente no Gerenciador de Configurações .

Semelhante ao motivo de William Edmondson para esse problema, mudei minha configuração do Configuration Manager de "Debug" "Any CPU" para "Debug" ".NET". O problema era que a versão ".NET" NÃO estava configurada para criar TODOS os projetos, portanto algumas das minhas DLLs estavam desatualizadas (enquanto outras estavam atualizadas). Isso causou vários problemas ao iniciar o aplicativo.

A correção temporária foi fazer a sugestão de Kenny Eliasson para limpar os diretórios \ bin e \ obj. No entanto, assim que eu fiz mais alterações nos projetos que não foram compilados, tudo falhou novamente.

cat5dev
fonte
0

Eu também recebi esse problema ao criar o novo suplemento do Microsoft Word com o Visual Studio 2015. O problema é que eu tenho 2 versões do MS Office, 2013 e 2016. Desinstalo o MS Office 2013 e ele funciona.

amzdmt
fonte
0

Crio alguns projetos para o SharePoint e, é claro, os implantei. Uma vez aconteceu.

Encontrei um assembly antigo em C: \ Windows \ assembly \ temp \ xxx (com FarManager), removi-o após a reinicialização e todos os projetos foram criados.

Eu tenho uma pergunta para o MSBuild, porque nos assemblies de projetos vinculados como projetos e cada assembly é marcado como "Copiar local", mas não no GAC.

Ilya
fonte
0

Eu sou capaz de corrigir esse problema marcando "Copiar Local = True" em todos os arquivos DLL referenciados no projeto, reconstruindo e implantando em um servidor de teste.

Srinivasa Rao
fonte
0

Eu tive um problema com o automap. Na binpasta, o arquivo automap.4net.dll estava lá, mas por algum motivo o automap.xml e o automap.dll não estavam. Copiá-los para o bindiretório resolveu o problema.

alex440
fonte