2010-07-19 6 views
2

Je développe sous Windows 7 64 bits avec Visual Studio 2008. J'ai une collection de bibliothèques de classes que je fusionne en une seule DLL en utilisant ILMerge. Cependant, lorsque je tente d'utiliser cette DLL fusionné, je reçoisBadImageFormatException avec DLL .NET ILMerged sous Windows 7 64

[BadImageFormatException: Impossible de charger le fichier ou l'assembly « MyMergedDll » ou une de ses dépendances. On a tenté de charger un programme avec un format incorrect.]

J'ai cherché autour de l'aide avec cela et il semblait que je devais définir la propriété de construction dans chaque projet MyMergedDll pour cibler x86, donc je l'ai fait. J'ai également défini tous les projets non-MSTest dans le service Web dans lequel je référence MyMergedDll pour cibler x86. Je reçois toujours cette erreur, cependant.

Si this blog entry est à croire, je peux obtenir cette erreur en raison de faire:

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

C'est, ayant une contrainte de classe sur un générique. L'article de blog date de 2007, donc je ne sais pas si cela s'applique toujours. Je voulais des informations de StackOverflow sur ce que les gars pensent du problème avant d'aller chercher toutes les classes génériques dans mes projets pour vérifier les contraintes.

Si cela est important, MyMergedDll est signé avec un nom fort. J'essaye d'employer MyMergedDll dans une application de console et dans un service Web. Je ne sais pas si les choses sont peut-être compliquées par le fait que IIS mette à jour chaque fois que je reconstruis le service web. Avec l'application de console, je semble seulement obtenir le BadImageFormatException quand je construis en mode de libération.

+0

Pouvez-vous clarifier certains points: 1. Avez-vous l'erreur lors de l'exécution de ILMerge ou pendant l'exécution de l'application? –

+0

Les DLL de projet individuelles se fusionnent parfaitement avec ILMerge. L'application de console et le service Web qui utilisent la DLL fusionnée sont très bien construits. J'obtiens l'erreur quand j'ai soit) exécutez mon application de console ou b) visitez le fichier .asmx sur mon serveur Web exécutant le service Web. –

Répondre

2

Je l'ai à travailler et je pense qu'il était de faire deux choses:

  1. MyMergedDLL a été construit en utilisant deux autres ensembles que j'ai le contrôle sur, mais ces ensembles ont été mis à ne pas cibler x86. J'ai reconstruit ces assemblys ciblant x86, reconstruit les assemblys qui composent MyMergedDLL et fusionné ceux assemblés pour former une nouvelle copie de MyMergedDLL.
  2. L'application de console qui utilise MyMergedDLL a été définie sur x86 en mode Débogage mais pas en mode Libération, d'où la raison pour laquelle elle fonctionnerait en mode Débogage mais donnerait BadImageFormatException en mode Libération.

La première chose n'aurait peut-être pas été nécessaire. Je pense que j'avais juste besoin que le consommateur de MyMergedDLL cible aussi x86 en mode Release. Je n'ai jamais pu déterminer quelle version d'ILMerge j'utilisais, alors je l'ai juste réinstallé avec le dernier MSI que j'ai pu trouver sur le site de Microsoft.

0

Avez-vous revérifié la version d'ILMerge que vous utilisez?

Je demande parce qu'une vieille version incorrecte de aspnet_merge (qui fait fondamentalement la même fusion de dlls entre autres) nous a causé les mêmes problèmes que vous décrivez. Je suis allé dans certains détails en répondant à this question pour quelqu'un d'autre sur SO. Il peut être utile de jeter un coup d'œil à la DLL dans ILDASM (Reflector a tendance à tomber quand vous essayez de décompiler ces mauvaises DLL - peut-être sans surprise) et de voir si vous pouvez comprendre le point de corruption et ce qui correspond à dans votre code car cela peut éclairer le problème.

+0

Comment vérifier la version ILMerge? J'ai essayé '-v',' -V', '--version',' -h', mais pas de chance. Les seuls documents dans C: \ Program Files (x86) \ Microsoft \ ILMerge sont ILMerge License.rtf et ILMerge.doc, dont aucun ne semble contenir une version. Ils semblent avoir été modifiés en 2009. Je vais essayer ILDASM sur ma DLL fusionnée, merci. –

+0

C'est la première fois que j'utilise ILDASM. Devrait-il s'étouffer et afficher un message d'erreur quelque part? Je ne vois rien de mal quand j'ouvre ma DLL fusionnée dedans, juste la hiérarchie d'espace de noms. –

+0

@Sarah - il ne s'étouffe pas, mais l'IL qu'il génère contient des erreurs telles que [SIGNATURE ENDED PREMATURELY], et IIRC une erreur à propos de "type not found". C'est la présence de ces erreurs qui nous a permis de déterminer quel code avait un problème. Il s'est avéré, dans notre cas, être des problèmes avec les expressions lambda qui (éventuellement) nous ont conduit vers la version de ILMerge précédant .Net 3.5. Il vaut vraiment la peine de s'assurer que vous utilisez le plus récent ILMerge je dirais, juste pour être sûr. –

Questions connexes