Eu estava olhando a documentação do msdn e ainda estou um pouco confuso sobre qual é exatamente a diferença entre usar LoadFile
e LoadFrom
carregar um assembly. Alguém pode fornecer um exemplo ou uma analogia para melhor descrevê-lo. A documentação do MSDN me confundiu mais. Além disso, é ReflectionOnlyLoadFrom
o mesmo que LoadFrom
exceto que ele carrega a montagem apenas no modo de reflexão.
Como minha experiência em .NET não é a melhor, aqui estão algumas perguntas sobre a documentação do MSDN usando o LoadFile:
1) O que significa LoadFile
examinar assembléias com a mesma identidade, mas localizadas em caminhos diferentes? Qual é a identidade (exemplo)?
2) Ele afirma LoadFile
que não carrega arquivos no 'Contexto LoadFrom' e não resolve dependências usando o caminho de carregamento. O que isso significa, alguém pode dar um exemplo?
3) Por fim, afirma que LoadFile
é útil nesse cenário limitado porque o LoadFrom não pode carregar assemblies que tenham as mesmas identidades, mas caminhos diferentes; ele carregará apenas o primeiro assembly, o que novamente me leva à mesma pergunta: qual é a identidade dos assemblies?
Respostas:
Isso esclarece?
Editar : para responder às perguntas que você levantou na sua pergunta revisada, você definitivamente quer ler Suzanne Cook sobre Assembly Identity .
Existem muitas regras que governam como os assemblies são carregados e alguns deles têm a ver com a maneira como resolvem dependências - se o AssemblyA é dependente do AssemblyB, onde o .NET deve procurar o AssemblyB? No Global Assembly Cache, o mesmo diretório que encontrou AssemblyA, ou em algum outro lugar inteiramente? Além disso, se encontrar várias cópias dessa montagem, como escolher qual usar?
LoadFrom
tem um conjunto de regras, enquantoLoadFile
tem outro conjunto de regras. É difícil imaginar muitas razões para usarLoadFile
, mas se você precisar usar a reflexão em diferentes cópias da mesma montagem, está lá para você.fonte
string.Compare(x, y) == 0
? Eu acho que você querx == y
lá? Se por motivos obscuros você deseja uma verificação de igualdade dependente da cultura, é mais claro escreverstring.Equals(x, y, StringComparison.CurrentCulture)
, por exemplo.Do blog de Suzanne Cook :
Veja aqui .
Consulte também Escolhendo um artigo de contexto de ligação no mesmo blog.
fonte
Depois de muito coçar a cabeça, descobri uma diferença esta tarde.
Eu queria carregar uma DLL em tempo de execução, e a DLL residia em outro diretório. Essa DLL tinha suas próprias dependências (DLLs), que também residiam no mesmo diretório.
LoadFile (): carregou a DLL específica, mas não as dependências. Portanto, quando a primeira chamada foi feita de dentro da DLL para uma dessas outras DLLs, lançou um FileNotFoundException.
LoadFrom (): carregou a DLL que especifiquei e também todas as dependências que viviam nesse diretório.
fonte
FileNotFoundException
mensagem ao criar uma nova instância de um objeto definido em um assembly referenciado pelo assembly que eu acabei de carregar.LoadFile
. Alterar isso para.LoadFrom
apareceu para corrigir o problema, mas eu não sabia o porquê! ObrigadoNota: Se um assembly for carregado usando um caminho 8.3 e, a partir de um caminho não-8.3, eles serão vistos como conjuntos diferentes, mesmo que sejam a mesma DLL física.
fonte
O .NET possui um contexto de carregamento diferente. Suzanne Cook escreveu sobre eles aqui: http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx
É assim que as .Net colocam as referências em quarentena.
fonte
uma diferença que eu notei é:
Assembly.LoadFile - Carrega o assembly no AppDomain diferente, com direitos de usuário limitados (princípio da diferença). operações como serilização / desserilização não puderam ser executadas.
Assembly.LoadFrom - Carrega o assembly no mesmo AppDomain com os mesmos direitos de usuário (mesmo princípio).
fonte
No meu caso, eu apenas tive que excluir o cache do aplicativo ASP localizado @
C:\Windows\Microsoft.NET\Framework\[asp version]\Temporary ASP.NET Files
. É reconstruído quando o site é executado pela primeira vez. Certifique-se de parar o IIS primeiro.Espero que isso ajude alguém como fez por mim.
fonte