Pergunta

Alguém tem alguma idéia do que faria com que o carregador de fusão simplesmente pular sobre um DLL sem nenhum aviso ou reconhecimento?

Quando tento fazer isso (em C #) de um aplicativo de linha de comando

Assembly.LoadFrom("c:\\Deploy\\bin\\WebServices.dll")

Eu vejo isso:

"Não é possível carregar um ou mais dos tipos solicitados. Recuperar a propriedade LoaderExceptions para mais informações."

Essa DLL tem uma dependência em Platform.DLL, mas o carregamento de que a dependência falhar assim que esta linha de código gera uma exceção. Quando eu verificar a Fusão de montagem de carregamento de mensagem, isto é o que eu vejo:

=== Pre-bind state information ===
LOG: DisplayName = Platform, Version=9.0.0.0, Culture=neutral, PublicKeyToken=null (Fully-specified)

...

LOG: This bind starts in LoadFrom load context.
WRN: Native image will not be probed in LoadFrom context. Native image will only be probed in default load context, like with Assembly.Load().
LOG: No application configuration file found.
LOG: Using machine configuration file from C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\config\\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///C:/Project/bin/Debug/Platform.DLL.
LOG: Attempting download of new URL file:///C:/Project/bin/Debug/Platform/Platform.DLL.
LOG: Attempting download of new URL file:///C:/Project/bin/Debug/Platform.EXE.
LOG: Attempting download of new URL file:///C:/Project/bin/Debug/Platform/Platform.EXE.
LOG: Attempting download of new URL file:///c:/Deploy/bin/Platform.DLL.
LOG: Attempting download of new URL file:///c:/Deploy/bin/Platform/Platform.DLL.
LOG: Attempting download of new URL file:///c:/Deploy/bin/Platform.EXE.
LOG: Attempting download of new URL file:///c:/Deploy/bin/Platform/Platform.EXE.

A coisa é, a DLL é presente no c:\Deploy\bin\Platform.DLL, com versão adequada e não assinado de chave pública.

Coisas que eu tenha pensado:
1. Talvez seja realmente uma dependência de Platform.DLL que está quebrado, fazendo com que este comportamento? (I perseguido a árvore de dependência no refletor, mas não encontrou DLLs faltando)
2. Talvez haja uma incompatibilidade versão / debug, ou um 64-bit vs 32 bits? mas tudo foi construído na mesma máquina
3. Talvez eu esteja interpretando mal os logs, mas não deve parar quando se atinge um DLL que ele encontra? Não vejo tanto o "sucesso" ou se a mensagem "sem sucesso" neste log. Eu só sei que falhou por causa da exceção.

PS detalhes mais tecnologia:
ambiente de máquina é o Windows 2008 de 64 bits, com .NET 2.0, 3.0 e 3.5 instalado.
Esta mesma aplicação funciona muito bem em outra máquina (Vista 32-bit), com a mesma estrutura de diretório e DLLs, embora aqueles foram construídas nessa máquina

Foi útil?

Solução

Yep ele deve parar quando se encontra a DLL necessária para o quinto "A tentativa de download ..." deve tê-lo encontrado ...

No entanto, onde está o aplicativo de linha de comando a ser executado a partir de? Se é a pasta de depuração, em seguida, algumas coisas que você pode tentar são

  1. Ter a DLL dependente é na mesma pasta
  2. Assinar o assembly e referência através de um arquivo .config no seguinte formato

    <dependentAssembly>
        <assemblyIdentity name="WebServices.dll" publicKeyToken="<whatever this public key it>" />
        <codeBase version="1.0.0.0" href="..\WebServices.dll" />
    </dependentAssembly>
    
  3. assiná-los e, em seguida, colocar os assemblies dependentes no GAC.

Eu poderia estar longe, mas isso é algumas coisas para tentar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top