Não foi possível carregar o tipo do erro de montagem


120

Escrevi o seguinte teste simples ao tentar aprender a Interface Fluente de Castle Windsor:

using NUnit.Framework;
using Castle.Windsor;
using System.Collections;
using Castle.MicroKernel.Registration;

namespace WindsorSample {
    public class MyComponent : IMyComponent {
        public MyComponent(int start_at) {
            this.Value = start_at;
        }
        public int Value { get; private set; }
    } 
    public interface IMyComponent {
        int Value { get; }
    }

    [TestFixture]
    public class ConcreteImplFixture {
        [Test]
        public void ResolvingConcreteImplShouldInitialiseValue() {
            IWindsorContainer container = new WindsorContainer();
            container.Register(Component.For<IMyComponent>().ImplementedBy<MyComponent>().Parameters(Parameter.ForKey("start_at").Eq("1")));
            IMyComponent resolvedComp = container.Resolve<IMyComponent>();
            Assert.AreEqual(resolvedComp.Value, 1); 
        }
    }
}

Quando executo o teste através do TestDriven.NET, obtenho o seguinte erro:

System.TypeLoadException : Could not load type 'Castle.MicroKernel.Registration.IRegistration' from assembly 'Castle.MicroKernel, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc'.
at WindsorSample.ConcreteImplFixture.ResolvingConcreteImplShouldInitialiseValue()

Quando executo o teste através da NUnit GUI, obtenho:

WindsorSample.ConcreteImplFixture.ResolvingConcreteImplShouldInitialiseValue:
System.IO.FileNotFoundException : Could not load file or assembly 'Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc' or one of its dependencies. The system cannot find the file specified.

Se eu abrir a Assembléia que estou referenciando no Reflector, posso ver suas informações:

Castle.MicroKernel, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc

e que ele definitivamente contém Castle.MicroKernel.Registration.IRegistration

O que poderia estar acontecendo?

Devo mencionar que os binários são retirados da versão mais recente do Castle, embora eu nunca tenha trabalhado com o nant, então não me incomodei em compilar novamente a partir do código-fonte e apenas peguei os arquivos no diretório bin. Devo também salientar que meu projeto é compilado sem nenhum problema.

Respostas:


111

A montagem está no Global Assembly Cache (GAC) ou em algum lugar que possa estar substituindo a montagem que você acha que está sendo carregada? Geralmente, isso é o resultado de um assembly incorreto sendo carregado. Para mim, isso significa que normalmente tenho algo no GAC substituindo a versão que tenho no bin / Debug.


1
Adicionei os assemblies navegando até os arquivos DLL, para que o GAC não deva estar entrando na equação. Também clique direito sobre o montagem-> aberto no refletor a partir do gerenciador solução traz-lo no refletor com todas as informações que eu esperaria
— George Mauer

7
Não importa como você o adicionou, se um assembly com o mesmo nome / versão existir no GAC, ele será carregado.
— Eric Schoonover

1
O VS.NET listará o caminho para o assembly selecionado e o refletor abrirá o assembly correto, mas quando o aplicativo executar, o runtime do .NET carregará o assembly do GAC.
— Eric Schoonover

11
Esta é a segunda vez que essa resposta salva minha bunda. Eu votaria novamente se pudesse.
— whybird

17
(GAK dizer em voz alta O próprio som do nome avisa de como é...)
— whybird

131

Se você tiver um projeto referenciando outro projeto (como um tipo de 'Aplicativo do Windows' referenciando uma 'Biblioteca de Classes') e ambos tiverem o mesmo nome de Assembly, você receberá esse erro. Você pode nomear fortemente o projeto referenciado ou (melhor ainda) renomear a montagem do projeto de referência (na guia 'Aplicativo' das propriedades do projeto no VS).


Além disso: tente limpar a pasta de saída. Provavelmente, a renomeação da biblioteca pode causar o mesmo problema, porque os dois (antigos e novos) serão colocados na mesma pasta de saída.
— Manushin Igor 21/07

Se você recortar e colar um projeto e não editar corretamente todos os campos, isso poderá levar a esse problema!
— Michael Parker

1
Era isso para mim, eu já havia mencionado a Assembléia na biblioteca de classes referenciada. Eu tive que entrar no arquivo web.config do meu projeto web e remover a referência <dependantAssembly> depois de desinstalar o pacote no nuGet para fazê-lo funcionar.
— Ivan

16

A solução para isso para mim não foi mencionada acima, então pensei em adicionar minha resposta à cauda longa ...

Acabei tendo uma referência antiga para uma classe ( HttpHandlerweb) no web.config que não estava mais sendo usada (e não era mais uma referência válida). Por alguma razão, ele foi ignorado durante a execução no Studio (ou talvez eu ainda tenha essa classe acessível na minha configuração de desenvolvedor?) E, portanto, só recebi esse erro quando tentei implantar no IIS. Eu procurei no nome do assembly em web.config, removi a referência do manipulador não utilizado, então esse erro desapareceu e tudo funciona muito bem. Espero que isso ajude outra pessoa.


1
Tinha algo muito semelhante, a única diferença era que a referência do web.config à DLL ainda estava implantada no diretório bin. Esse binário, por sua vez, fazia referência a uma versão antiga de uma DLL compartilhada que causava a exceção.
— santos

10

Eu tive o mesmo problema e, para mim, não tinha nada a ver com namespace ou nomeação de projetos.

Mas, como vários usuários sugeriram, isso tinha a ver com uma montagem antiga ainda sendo referenciada.

Eu recomendo excluir todas as pastas "bin" / binárias de todos os projetos e recriar toda a solução. Isso acabou com todos os assemblies potencialmente desatualizados e, depois disso, o MEF exportou todos os meus plugins sem problemas.


8

Eu estava recebendo esse erro e nada que encontrei no StackOverflow ou em outro lugar o resolveu, mas a resposta do bmoeskau a esta pergunta me indicou a direção certa para a correção, que ainda não foi mencionada como resposta. Minha resposta não está estritamente relacionada à pergunta original, mas a estou postando aqui, supondo que alguém com esse problema encontre o caminho para pesquisar no Google ou algo semelhante (como eu daqui a um mês, quando isso me morder novamente) , arg!).

Minha montagem está no GAC, portanto, teoricamente, existe apenas uma versão da montagem disponível. Exceto que o IIS é útil para armazenar em cache a versão antiga e me fornecer esse erro. Acabei de alterar, reconstruir e reinstalar a montagem no GAC. Uma solução possível é usar o Gerenciador de tarefas para matar o w3wp.exe . Isso força o IIS a reler o assembly do GAC: problema resolvido.


3

A versão = 1.0.3.0 indica o Castle RC3, no entanto, a interface fluente foi desenvolvida alguns meses após o lançamento do RC3. Portanto, parece que você tem um problema de versão. Talvez você tenha o Castle RC3 registrado no GAC e esteja usando esse ...


Interessante, recebi a versão mais recente aqui: builds.castleproject.org/cruise/DownloadBuild.castle?number=956 É o que eles recomendaram em seu fórum. Além disso, se fosse esse o caso, imagino que o projeto não seria compilado. Mas isso não compila nenhum problema #
— George Mauer

Quanto a ter a versão no GAC, provavelmente, mas não adicionei a referência do GAC e o uso do refletor na referência indica que é a que eu pensava
— George Mauer

Tente remover o assembly duplicado do GAC. Quero que esse seja o seu problema.
— Eric Schoonover

3

Eu recebo isso de vez em quando e sempre foi bom ter a montagem no GAC


3

Se esse erro causado pela alteração do espaço para nome, verifique se a pasta desse projeto foi renomeada com o mesmo nome e feche o VS.NET Edite o projeto com o problema no Bloco de Notas e substitua os nós

"RootNamespace> New_Name_Of_Folder_Of_Your_Project_Namespace" RootNamespace> "AssemblyName> New_Name_Of_Folder_Of_Your_Project_Namespace" AssemblyName>


3

A exclusão do meu arquivo .pdb para a dll resolveu esse problema para mim. Acho que tem algo a ver com o fato de que a dll foi criada usando o ILMerge.


Foi isso para mim! Não sei o que é o ILMerge, mas a Epicor não gostou de ter o arquivo pdb ao lado do meu assembly.
— MDave

Nenhum ILMerge, mas a exclusão de todos os arquivos PDB resolveu o problema.
— precisa saber é o seguinte

3

Quando encontro esse problema, acho a ferramenta FUSLOGVW muito útil. Ele está verificando informações de ligação de montagem e as registra para você. Às vezes, as bibliotecas estão ausentes, às vezes o GAC tem versões diferentes que estão sendo carregadas. Às vezes, a plataforma de bibliotecas referenciadas está causando os problemas. Essa ferramenta deixa claro como as ligações das dependências estão sendo resolvidas e isso pode realmente ajudá-lo a investigar / depurar seu problema.

Visualizador de log do Fusion / fuslogvw / Visualizador de log de ligação de montagem. Confira mais / faça o download aqui: http://msdn.microsoft.com/en-us/library/e74a18c4.aspx .


Existe uma maneira de fazer o FUSLOGVW funcionar com o Visual Studio Designer? O Visual Studio Designer lança uma exceção quando tento editar uma das minhas caixas de diálogo ("Método não encontrado"), para um método que eu sei que existe (o aplicativo funciona bem). Tanto quanto posso ver, nada aparece no FUSLOGVW ao editar algo no Visual Studio Designer.
— Jimmy

3

Eu tive esse problema depois de fatorar um nome de classe:
Could not load type 'Namspace.OldClassName' from assembly 'Assembly name...'.

Parar o IIS e excluir o conteúdo Temporary ASP.NET Filescorrigiu para mim.

Dependendo do seu projeto (32/64 bits, versão .net, etc), o correto Temporary ASP.NET Filesdifere:

  • 64 Bit
    %systemroot%\Microsoft.NET\Framework64\{.netversion}\Temporary ASP.NET Files\
  • 32 Bit
    %systemroot%\Microsoft.NET\Framework\{.netversion}\Temporary ASP.NET Files\
  • Na minha máquina de desenvolvimento era (porque talvez seja o IIS Express?)
    %temp%\Temporary ASP.NET Files

3

Talvez não seja tão provável, mas para mim foi causado pelo meu aplicativo tentar carregar uma biblioteca com o mesmo nome de assembly (xxx.exe carregando xxx.dll).


2

Basta encontrar isso com outra causa:

executando testes de unidade no modo de liberação, mas a biblioteca que está sendo carregada era a versão do modo de depuração que não havia sido atualizada


2

Outra solução: DLLs antigas apontando uma para a outra e armazenadas em cache pelo Visual Studio no

C:\Users\[yourname]\AppData\Local\Microsoft\VisualStudio\10.0\ProjectAssemblies

Saia do VS, exclua tudo nesta pasta e Bob é seu tio.


2

Eu tive o mesmo problema. Acabei de resolver isso atualizando o assembly via GAC.

Para usar gacutil em uma máquina de desenvolvimento acesse: Start -> programs -> Microsoft Visual studio 2010 -> Visual Studio Tools -> Visual Studio Command Prompt (2010).

Eu usei esses comandos para desinstalar e reinstalar, respectivamente.

gacutil /u myDLL

gacutil /i "C:\Program Files\Custom\mydllname.dll"

Nota: eu não desinstalei minha dll no meu caso, apenas atualizei a dll com o caminho atual.


2

Eu me deparei com esse cenário ao tentar carregar um tipo (via reflexão) em um assembly que foi criado com uma versão diferente de uma referência comum ao aplicativo em que esse erro apareceu.

Como tenho certeza de que o tipo não foi alterado nas duas versões do assembly, acabei criando um resolvedor de assembly personalizado que mapeia o assembly ausente para o que meu aplicativo já carregou. A maneira mais simples é adicionar um construtor estático à classe do programa da seguinte maneira:

using System.Reflection
static Program()
{
    AppDomain.CurrentDomain.AssemblyResolve += (sender, e) => {
        AssemblyName requestedName = new AssemblyName(e.Name);

        if (requestedName.Name == "<AssemblyName>")
        {
            // Load assembly from startup path
            return Assembly.LoadFile($"{Application.StartupPath}\\<AssemblyName>.dll");
        }
        else
        {
            return null;
        }
    };
}

Obviamente, isso pressupõe que o Assembly esteja localizado no caminho de inicialização do aplicativo e possa ser facilmente adaptado.


Devo observar que esta solução se aplica aos casos em que você fornece seus assemblies a terceiros e não pode garantir que todos sejam atualizados na hora certa. Caso contrário, é preferível uma recompilação com as referências corrigidas.
— JBartlau

2

Basta encontrar isso com outra causa:

Eu estava usando um assembly mesclado criado com o ILRepack. A montagem da qual você está consultando os tipos deve ser a primeira passada para o ILRepack ou seus tipos não estarão disponíveis.



1

Isso geralmente acontece quando você tem uma versão do seu assembly implantada no GAC, mas não foi atualizada com as novas classes que você pode ter adicionado ao assembly no seu IDE. Portanto, verifique se a montagem no GAC está atualizada com as alterações que você pode ter feito no seu projeto.

Por exemplo, se você possui uma Biblioteca de Classes Comum e nessa Biblioteca de Classes você tem o tipo Common.ClassA e implanta-o no GAC com forte nome. Você vem mais tarde e adiciona outro tipo chamado Common.ClassB e executa seu código no IDE sem antes implantar as alterações feitas no GAC of Common com o tipo Common.ClassB recém-adicionado.


1

Eu recebi o mesmo erro depois de atualizar uma dll referenciada em um projeto executável de área de trabalho. O problema era que as pessoas mencionadas aqui relacionavam uma referência antiga e simples de corrigir, mas não foram mencionadas aqui, então pensei que poderia economizar o tempo de outras pessoas.

De qualquer forma, atualizei a DLL A e recebi o erro de outra DLL referenciada, vamos chamá-la de B aqui, onde a DLL A tem uma referência à DLL B.

A atualização da DLL B corrigiu o problema.


1

Adicionando sua DLL ao GAC (cache global de assemblies)

Prompt de Comando do Visual Studio => Executar como Administrador

gacutil / i "caminho do arquivo dll"

Você pode ver o conjunto adicionado C: \ Windows \ system32 \

Ele também resolverá a DLL ausente ou "Não foi possível carregar o arquivo ou o conjunto" na tarefa de script SSIS


1
Observarei que adicionar coisas ao GAC geralmente é uma má idéia, dificulta a implantação e geralmente é algo que até a Microsoft está se afastando.
— George Mauer

1

Ocorreu um problema semelhante no Visual Studio 2017 usando o MSTest como estrutura de teste. Eu estava recebendo exceções System.TypeLoadException ao executar alguns (não todos) testes de unidade, mas esses testes de unidade passavam quando depurados. Eu finalmente fiz o seguinte que resolveu o problema:

  1. Abra o arquivo Local.testsettings na solução
  2. Vá para as configurações de "Teste de unidade"
  3. Desmarque a opção "Usar o contexto de carregamento para montagens no diretório de teste". caixa de seleção

Após executar essas etapas, todos os testes de unidade começaram a passar quando executados.


1

Eu experimentei o mesmo que acima, depois de remover a assinatura de montagens na solução. Os projetos não seriam construídos.

Descobri que um dos projetos referenciava o pacote StrongNamer NuGet, que modifica o processo de criação e tenta assinar pacotes Nuget não assinados.

Depois de remover o pacote StrongNamer, consegui construir o projeto novamente sem assinar / nomear fortemente os assemblies.


-2

Acabei de resolver isso executando o comando iisreset usando o prompt de comando ... Sempre a primeira coisa que faço quando recebo esses erros.


4
Sinto muito, mas isso não tem nada a ver com a pergunta, faz suposições sobre o uso do iis e não explica o que está acontecendo para causar o problema.
— 21415 George Mauer #
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.