Pergunta

Estou desenvolvendo em Windows 7 64 bits com Visual Studio 2008.Eu tenho uma coleção de bibliotecas de classes que mesclo em uma única DLL usando ILMerge.Quando tento usar essa DLL mesclada, no entanto, recebo

[BadImageFormatException:Não foi possível carregar o arquivo ou assembly 'MyMergedDll' ou uma de suas dependências.Foi feita uma tentativa de carregar um programa com formato incorreto.]

Tenho procurado ajuda com isso e parecia que precisava definir a propriedade Build em cada projeto em MyMergedDll para atingir x86, então fiz isso.Também configurei todos os projetos não MSTest no serviço da web no qual estou referenciando MyMergedDll para direcionar x86.Ainda estou recebendo esse erro, no entanto.

Se esta entrada do blog é para acreditar, posso obter esse erro como resultado de fazer:

public class SpecificClass: BaseClass: where T : class { }

Ou seja, ter uma restrição de classe genérica.A entrada do blog é de 2007, então não sei se isso ainda se aplica.Eu queria alguma opinião do StackOverflow sobre o que vocês acham que é o problema antes de rastrear todas as classes genéricas em meus projetos para verificar as restrições.

Se for importante, MyMergedDll é assinado com um nome forte.Estou tentando usar MyMergedDll em um aplicativo de console e em um serviço da web.Não sei se as coisas são complicadas pelo fato de o IIS estar ou não atualizando toda vez que eu reconstruo o serviço da web.Com o aplicativo de console, parece que só consigo o BadImageFormatException quando eu construo no modo Release.

Foi útil?

Solução

Eu fiz funcionar e acho que foi fazendo duas coisas:

  1. MyMergedDLL foi criado usando alguns outros assemblies sobre os quais tenho controle, mas esses assemblies não foram configurados para x86.Eu reconstruí esses assemblies direcionados ao x86, reconstruí os assemblies que compõem o MyMergedDLL e mesclei novamente esses assemblies para formar uma nova cópia do MyMergedDLL.
  2. O aplicativo de console que usa MyMergedDLL foi definido para direcionar x86 no modo de depuração, mas não no modo de liberação, por isso funcionaria no modo de depuração, mas forneceria o BadImageFormatException no modo Liberação.

A primeira coisa pode não ter sido necessária.Acho que só precisava que o consumidor de MyMergedDLL também visasse x86 no modo Release.Nunca consegui descobrir qual versão do ILMerge estava usando, então apenas reinstalei-o com o MSI mais recente que encontrei no site da Microsoft.

Outras dicas

Você verificou novamente a versão do ILMerge que está usando?

Eu pergunto porque uma versão antiga e incorreta do aspnet_merge (que basicamente faz a mesma mesclagem de DLLs entre outras coisas) nos causou os mesmos problemas que você está descrevendo.Entrei em alguns detalhes ao responder esse pergunta para outra pessoa no SO.

Pode valer a pena dar uma olhada rápida na dll no ILDASM (o Reflector tende a cair ao tentar descompilar essas dlls ruins - talvez sem surpresa) e ver se você consegue entender o ponto da corrupção e o que isso corresponde no seu código como pode esclarecer o problema.

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