2009-03-02 10 views
13

Après avoir déployé un webservice ASP.net à mon serveur de production je suis arrivé cette exception:System.MissingMethodException - 3.5 SP1 versioning enfer

System.MissingMethodException

Méthode non trouvée: « Boolean système .Threading.WaitHandle.WaitOne (Int32) »

Les états MSDN documentation:

Informations sur la version .NET Framework Pris en charge dans: 3.5 SP1, 3.0 SP2, 2.0 SP2

donc la raison de cette erreur est que mon serveur n'a pas été mis à jour le dernier service pack.

La question est:

Pourquoi démarrer le code? IMO si la version du framework cible est différente, l'application ne devrait pas démarrer du tout. Comment puis-je m'assurer que mon code peut s'exécuter sur la version du framework de machine cible avant JIT?

C'est fou. Je pense que Microsoft devrait prendre plus au sérieux les problèmes de version.

Répondre

4

La même chose m'est arrivée avec 1.1 et 1.1 SP1 il y a longtemps ... Je suppose qu'il n'y a pas une bonne solution puisque les assemblages ont la même version, vous pouvez essayer de la valider manuellement en lisant le .net installé ou installez simplement les derniers service packs dans tous vos dev et machines de production.

+0

Merci pour vos commentaires. Quel dommage quand même! –

7

Je suis d'accord. Le problème est que les numéros de version d'assemblage n'ont pas changé. Lors de la transition vers .NET 3.5 SP1, je m'assurais que les développeurs n'utilisaient pas les API spécifiques au SP1 en s'assurant que le SP n'était pas installé sur le serveur de construction (la version framework du serveur de construction correspondait à la version du framework). Ensuite, une fois que nous étions prêts, SP1 a été installé sur le serveur de construction. Une approche similaire pourrait vous avoir sauvé de la douleur.

18

Bien que la méthode:

Boolean System.Threading.WaitHandle.WaitOne(Int32) 

n'existe pas, la méthode:

Boolean System.Threading.WaitHandle.WaitOne(Int32, bool) 

n'existe.

En regardant avec le réflecteur - le WaitOne(Int32) appelle WaitOne(Int32,bool) avec false comme valeur booléenne. Il suffit donc d'utiliser la deuxième signature, en fournissant false comme valeur booléenne, et vous devriez être très bien.

+2

J'ai eu le même problème que ci-dessus et cette solution a fonctionné pour moi. Je vous remercie! +1 – Connell

+2

@Nissim -> Nice m'a sauvé beaucoup de temps pour moi. – vijaysylvester

Questions connexes