Système.MissingMethodException Int32 Système.De l'environnement. get_CurrentManagedThreadId()
Quelle est la cause de l'exception suivante?
System.MissingMethodException Int32 System.Environment.get_CurrentManagedThreadId()
L'appel de cette méthode semble être généré par le compilateur C# pour les méthodes rendement IEnumerable<>
.
.NET Framework v4.0 x86 est installé et que le binaire est compilé pour la v4.0 CPU.
- Cela apparaît aussi comme la "Méthode non trouvé:
Int32.System.Environment.get_CurrentManagedThreadId()
.
Vous devez vous connecter pour publier un commentaire.
CurrentManagedThreadId
est un .NET 4.5 de la propriété, de sorte que vous aurez besoin de 4,5 pour exécuter le code.Voir Itérateur blocs, manquant méthodes, et .NET 4.5 pour une analyse de la façon dont ce problème peut se produire.
En bref:
Si vous construisez votre application (ciblant les .NET 4.0) sur un système .NET 4.5 est installé, il va utiliser 4.5 comme base pour la compilation, à cause de la .NET Framework 4.0 est toujours remplacé par .NET 4.5.
Si votre application utilise également
yield return
, il ne sera pas sur les systèmes ayant seulement 4.0 est installé parce que la mise en œuvre de cette instruction utilise une nouvelle propriété au moment de la compilation pour les 4,5 Cadre.Pour résoudre ce problème, assurez-vous que votre compilateur système a la 4.0 référence assemblées.
Thread.CurrentThread.ManagedThreadId
de nouveau. Je n'ai pas été en mesure de trouver ce document en ligne n'importe où, mais cela donne à penser que MS a résolu ce problème dans les versions ultérieures.Détachement floele's réponse; pour plus de contexte, voici une brève analyse du problème:
Lorsque le compilateur traite un itérateur bloc de retour d'un
IEnumerable
, il génère un privéIEnumerable
classe afin de conserver l'itération de la logique. C'est le début de la IL générées parGetEnumerator
méthode par le 4.0 compilateur:Avis les appels à
System.Threading.Thread::get_CurrentThread()
etSystem.Threading.Thread::get_ManagedThreadId();
. La méthode de génération utilise pour effectuer une optimisation où, si l'IEnumerable
est consommé immédiatement [1], la même instance d'objet est retourné (économiser le coût d'un appel du constructeur) .La suivante est IL générés par les 4,5 compilateur:
Avis les deux appels de la méthode précédente sont maintenant remplacés par des
System.Environment::get_CurrentManagedThreadId()
, qui est une propriété ajoutée dans .NET 4.5.Depuis la 4.5 mise à niveau remplace la version 4.0 compilateur C# (csc.exe), le code compilé pour la version 4.0 sur votre machine va utiliser le nouveau IL modèle et ne fonctionnera pas sur une vanille 4.0 installer, sauf si vous avez l' .NET 4.0 Référence Assemblées [2], ce qui entraîne le compilateur pour générer de l'ancienne version de l'IL.
[1] C'est la première fois qu'il est consommé sur le thread qui l'a créé (par exemple, dans une instruction foreach).
[2] Il est possible d'extraire la .NET 4.0 compilateur de la .NET Framework installer, et de modifier vos fichiers de projet pour compiler votre code avec que. Ce pourrait être une autre façon de résoudre le problème, mais c'est une longue histoire et je n'entrerai pas dans les détails ici