2011-05-10 4 views
3

J'ai un service Web qui déclenche une exception BadImageFormatException chaque fois que j'essaie d'exécuter le service à partir de Visual Studio. This answer à une autre question suggéré d'exécuter peverify contre les DLL pour voir s'il y a des problèmes. Bien que DLL de mon service web est très bien, le service Web dépend d'un ensemble ILMerged, qui fait des erreurs:Éviter BadImageFormatException lorsqu'il y a du code non managé

[IL]: Error: [C:\blah\MyILMergedAssembly.dll : Encryption

Utils.SecureStringExtensions::SecureEquals][offset 0x00000055][found unmanaged pointer] [expected unmanaged pointer] Unexpected type on the stack.

[IL]: Error: [C:\blah\MyILMergedAssembly.dll : Encryption

Utils.SecureStringExtensions::SecureEquals][offset 0x0000005D][found unmanaged pointer][expected unmanaged pointer] Unexpected type on the stack.

[IL]: Error: [C:\blah\MyILMergedAssembly.dll : Encryption

Utils.SecureStringExtensions::SecureEquals][offset 0x0000007E] Unmanaged pointers are not a verifiable type.

3 Error(s) Verifying .\MyILMergedAssembly.dll

(188 Warnings)

Je pense que ces souches de mon utilisation de Marshal et IntPtr dans MyILMergedAssembly, mais partout je le fais, je avoir la méthode déclarée comme unsafe. Comment puis-je me débarrasser des erreurs qu'offre peverify et, je l'espère, me débarrasser de l'exception BadImageFormatException qui survient lorsque j'essaie d'exécuter mon service Web?

Modifier: Il semble que je ne puisse pas utiliser ILMerge pour fusionner des assemblys qui ont un code non sécurisé. J'ai donc essayé que mon service web référence toutes les DLL individuelles dans MyILMergedAssembly, mais j'ai quand même une exception BadImageFormatException. Maintenant, cela me donne l'exception sur l'une des assemblées individuelles. Quand je lance PEVerify sur cette assemblée individuelle, je reçois:

[IL]: Error: [C:\blah\Connection.dll : Connection

.ConnectionBase::.ctor] [HRESULT 0x80070002] - The system cannot find the file specified.

La classe ConnectionBase auquel il fait référence est là dans Connection.dll, ou du moins il devrait être que la classe est définie dans l'espace de noms de connexion/projet. La connexion a 'Autoriser le code non sécurisé' cochée dans ses options de construction. Le constructeur dans ConnectionBase auquel il pourrait se référer est marqué comme internal.

Modifier: J'ai essayé de vérifier 'Autoriser le code non sécurisé' dans le projet de service Web qui utilise les DLL avec du code dangereux. J'ai également essayé d'ajouter compilerOptions="/unsafe" au fichier Web.config pour le service Web dans le fichier system.codedom> compilers> compiler node. Je reçois encore une page avec ce qui suit quand je lance le service Web, cependant:

Could not load file or assembly 'Connection' or one of its dependencies. An attempt was made to load a program with an incorrect format.

Répondre

1

homme Oh, c'est ennuyeux. Ce n'était pas un code dangereux, ce n'était pas les paramètres de la plate-forme cible 32/64 bits sur mes projets dans VS, ce n'était pas ILMerge. J'ai dû définir le paramètre Activer les applications 32 bits à True sur le pool d'applications dans IIS 7 (je suis sous Windows 7 64 bits). Après le redémarrage du pool d'applications, mon service Web se charge correctement. Merci à this blog pour m'avoir envoyé dans la bonne direction.

Questions connexes