11
votes

"Mauvaise signature binaire" dans l'application ASP.NET MVC

Nous obtenons l'erreur ci-dessus sur certaines pages d'une application ASP.NET MVC lorsqu'il est déployé dans une boîte de serveur Windows 2008 64 bits. Cela fonctionne bien sur nos machines de développement, bien que ce soit 32 bits XP. Je me demandais juste si quelqu'un l'avait rencontré auparavant et que des suggestions? Détails comme suit:

mauvaise signature binaire. (Exception de HRESULT: 0x80131192)

Description: Une exception non gérée s'est produite lors de l'exécution de la demande Web actuelle. Veuillez consulter la trace de la pile pour plus d'informations sur l'erreur et où elle est originaire du code.

Détails d'exception: System.RunTime.Interopservices.Comsception: mauvaise signature binaire. (Exception de HRESULT: 0x80131192)

Tous les projets sont définis pour compiler pour n'importe quel processeur et sont compilés en mode de sortie. Le site ASP.NET est précompilé et la construction précompilée est sur un agent de construction de TeamCity Windows 2008 de 64 bits. Merci d'avance.

Modifier

Nous sommes toujours en proie à ce sujet. J'ai consulté tous les fichiers binaires du répertoire bin du site Web à l'aide de Corflags.exe. Aucun n'a le drapeau 32 bits, et toutes ont une valeur CORFLAGS de 9 sauf pour ANTLR3.RunTime.dll, qui a une valeur de 1. Le problème n'affecte que certaines pages, et il semble être ceux qui utilisent la flueuretvalidation (y compris la fluentevalidation.mvc et fluentvalidation.xvalintégration des assemblys). Aucun de ceux-ci ne montre rien de côté de l'ordinaire lorsqu'il est inspecté avec Corflags.exe, et il n'y a pas de dépendances étranges étranges révélées par l'ildasme.

Lorsqu'il est construit localement (32 bits Windows XP), le site se déploie et fonctionne bien. Lorsqu'il est construit sur les agents de construction (serveur Windows 2008 64 bits), le site affiche ces erreurs. Le site fonctionne en mode pipeline intégré et n'est pas réglé sur 32 bits.

La trace de la pile est la suivante: xxx


3 commentaires

Cela mendie la question évidente, avez-vous regardé la ligne 53 du fichier Temp. ASP.NET créé?


C'est l'attelle de fermeture d'un en utilisant (html.beginform ("CreeeneEnternernal", "Utilisateur")) Block, qui comprend un résumé de validation. Le doigt est lentement mais désignant sûrement quelque chose à voir avec la flueuretvalidation / Xval ou quelque chose entre deux, je pense.


Question connexe Stackoverflow .com / questions / 11148423 / ...


6 Réponses :



2
votes

Badgerb dans Ce fil pourrait être sur quelque chose:

Suis-je trompé ou est cette erreur censé être causé quand une dll est changé de manière significative (le Signature d'un appel de méthode est modifié) sans recompiler le code qui utilise la DLL pour prendre la nouvelle signature dans compte.

On dirait que la différence entre les scénarios de travail et de non-travail est la machine / environnement utilisé pour construire les fichiers binaires. Pourrait-il s'agir de ce que lorsque vous construisez avec une équipe sur une machine 64 bits, l'interface ou la signature d'une méthode change qui provoque ensuite cette erreur?

Pouvez-vous poster la pile d'appels complète du moment où cette exception se produit? Y a-t-il des objets COM ou P / invoquer des appels au code natif? Utilisez-vous un code natif?


1 commentaires

Merci Chris, j'avais déjà lu ce fil, et je n'ai rien trouvé là pour m'aider. J'ai ajouté la trace de la pile (assemblée nommée tronquée). Aucun objet COM ou p / invoke - code géré pur.



2
votes

est-il possible que vous excluez un problème grave avec le serveur ou son logiciel?

Par la trace et votre commentaire à propos de la ligne 53, je considère sérieusement que quelque chose de corrompre sans rapport avec votre code, je m'attendrais à ce que tout code .NET connexe déclenché pour varier la pile dans l'erreur.


1 commentaires

Nous avons deux environnements, développement et qa, où le même comportement est exposé. Cela dit, les serveurs de ces environnements sont des machines virtuelles construites à partir de la même image, il pourrait donc y avoir un problème là-bas. Nous ne sommes pas en mesure d'obtenir d'autres serveurs Windows 2008 pour essayer cela.



8
votes

Je viens de voir un problème similaire à ce sujet où certaines expressions Lambda sont utilisées dans des vues qui conduisent à une corruption de la DLL .NET lorsqu'elle est compilée sur un système 64 bits. Il en résulte la même exception que vous voyez et sonne certainement comme un candidat probable.

Toutes mes excuses si cela semble un peu vague, car nous n'avons pas complètement résolu cela et je suis toujours en train de regarder, bien que je sois sûr que je serai sûr Pour mettre à jour ici lorsque nous avons une résolution.

Le sentier qui nous fait croire qu'il s'agit d'une DLL corrompue réelle, c'est que si vous visualisez votre DLL de vue compilée dans ildaste.exe et examinez l'appel de la méthode réelle impliquant L'erreur Lamda, vous obtenez une erreur "[Signature Termis prématuré]" "montrée dans l'ildasme. Le réflecteur de Redgate se bloque toutefois lors de la tentative d'élargir la méthode.

Dans notre cas, l'ildasme ressemble à ceci: xxx

Nous avons remarqué cela est un problème de 64 bits seulement. Nous sommes sur le point d'enquêter sur la question de savoir si cette question survient toujours sur .NET 4.0. Je vais mettre à jour ici quand nous savons.

Nous sommes également en train de voir si cela a été soulevé comme un bogue avec Microsoft. Encore une fois, je vais mettre à jour ici quand nous savons.

[EDIT: Ayant maintenant eu la cause première du problème]

Je pensais que je pensais d Revenez et mettez à jour cette réponse.

Pour nous, il s'est avéré que ce n'était pas un problème de compilateur du tout, mais un problème avec aspnet_merge. En bref, dans nos boîtes de construction 64 bits, nous utilisions une copie plus ancienne et obsolète de ASPNET_MERGE (accidentellement) qui semblait fonctionner mais aboutit à ces DLL corrompu (exactement de votre façon de décrire). Un chemin avait été modifié, notre projet de déploiement Web utilisait donc cette mauvaise version.

Mise à jour du chemin d'accès à aspnet_merge version 3.5 ou plus, corrigé le problème.

Nous pensions que c'était un problème de 64 bits à l'origine parce que nos boîtes de construction étaient le seul environnement de 64 bits que nous avons compilé sur (toutes nos postes de travail de Dev sont 32 bits) et le seul à avoir ce problème. Cependant, la "bizarre" était un hareng rouge!

J'espère que cela vous aide à résoudre votre problème.


1 commentaires

Parlez d'une réponse de dernière minute. Superbe - c'est exactement ce que le problème est. Toutes nos vues sont compilées dans une DLL par un projet de déploiement Web, et lorsque j'utilise il Idilas sur cette DLL, c'est exactement ce que je vois. Hâte d'avoir entendu parler de vos autres enquêtes; Pour le moment, au moins nous comprenons pourquoi cela se produit.



1
votes

Il suffit de mettre ceci là-bas, au cas où d'autres trouvent cette question.

J'ai eu un problème similaire, bien que le message d'erreur soit légèrement différent: System.BadimageFormatxception: mauvaise signature binaire. (Exception de HRESULT: 0x80131192)

J'ai suivi le problème vers une Lambda étant passé entre un projet de site Web .NET 4.0 et une bibliothèque de classe 3.5 après avoir été pré-compilée en utilisant aspnet_merge . .

Le problème uniquement présenté après l'installation de VS2012 (et sa mise à niveau en place de .NET 4.0 à 4.5).

La question associée "mauvaise signature binaire" dans l'application ASP.NET MVC semblait être plus spécifique à la question que je trouvé, donc j'ai donné une réponse plus détaillée là-bas.

espère que cela aide.


0 commentaires

0
votes

Comme cela a été ma source la plus importante au cours des trois derniers jours d'investigation, je posterai ma solution ici.

Semblable à d'autres signalant ce problème, nous avons eu un environnement de déploiement de 32 bits réussie en cours d'exécution, mais passe à 64 bits qui est le seul endroit que cela se produit. Il n'apparaît également que sur des pages spécifiques - pas «intermites» ou «aléatoirement» comme certains rapportent.

Après avoir décidé méthodiquement une foule de choses (prédominance aspnet_merge.exe et l'environnement) et Une page MVC où je pourrais reproduire le problème, je l'ai eu pour être un problème de code. D'autres endroits ont également souligné les expressions Lambda étant la cause qui est un peu vrai pour nous aussi. Le code suivant concerne le code dans les vues uniquement.

Pour atteindre le point, un code incorrect ou non, ce sera fonctionner sur aspnet_merge.exe version 4.x exécutée sur 32 bits: xxx

où comme sur aspnet_merge.exe version 4.x sur 64 bit, il a à écrire comme: xxx < / pré>

Je suis conscient que l'indice est dans le nom Iequality * comparateur * qui doit logiquement prendre deux arguments, mais la première version compilera et fonctionnera dans un environnement 32 bits.

J'espère que ce post aidera les autres dans la même situation. Je suis alors sûr que quelqu'un sera capable de le déchiffrer et de le broyer jusqu'à un problème IntPTR 32 VS-64-Bit de certains types bizarres.


0 commentaires