.NET de 4,6 nécessaires pour .NET 4.5.2 application compilée

Après la mise à niveau à partir de la construction de notre produit dans Visual Studio 2010 et .NET 4.0 pour Visual Studio 2015 et .NET 4.5.2 nous avons vu des problèmes de fonctionnement du produit sur la machine du client.

L'erreur que nous voyons est une System.MissingMethodException lancés lors du démarrage de l'application, qui en regardant les posts ici point à une version incorrecte de .NET est installé sur la machine. Maintenant, les clients de la machine .NET 4.5.2 installé comme cela est installé lors de l'installation de notre produit.

La façon dont nous avons déjà résolu le problème consiste à installer .NET de 4,6 sur la machine du client.

J'ai une théorie que j'idéalement souhaitez confirmer (bien, de préférence, d'ordures et de les remplacer par quelque chose de plus viable):

  • Tous nos projets sont mis à compiler contre .NET 4.5.2
  • L'agent de build qui compile le code et génère le programme d'installation de Visual Studio 2015 et, avec elle,.NET de 4,6 mais il a le nécessaire .NET framework 4.5.2

Je crois que parce que .NET 4.6 est installé, la machine, il est primordial de l' .NET 4.5.2. Je ne sais pas pourquoi ce serait passe, mais j'ai vu quelque chose de vaguement similaire où un .NET 4.0 de l'application en cours d'exécution sur une machine avec .NET 4.5 est installé se comporte de la façon dont un .NET 4.5 application ici (si elle est, je suis sûr que ça ne devrait pas l'être). J'espérais que quelqu'un pourrait être en mesure de préciser quelque chose qui me manque.

J'espère que ma théorie est fausse.

Des Informations Supplémentaires

J'ai réussi à attacher un débogueur lorsque l'application se bloque et le message d'erreur est:

Méthode ne trouve pas: '!!0 [].Tableau.Empty()'.

Il n'y a rien dans mon code qui utilise la Matrice.Empty().

StackTrace:

à MyApp.DisplayExceptionInfo(Exception ex)
au MyApp.Main(String[] args) dans E:\Build\MyApp\App.xaml.cs:line 82

DisplayExceptionInfo cherche simplement à afficher une Exception qui me fait croire qu'une Exception est levée plus tôt.
Main vérifie pour voir si il y a une autre instance en cours d'exécution par le biais de certains Interop (dont j'ai aussi essayé de l'enlever, mais elle ne résout pas le crash), puis crée mon Appli classe et l'exécute.

Mise à jour

Désolé, je ne crois pas que j'ai donné assez de détails dans ma question pour l'aider à aller au fond de la question. Il s'avère que TeamCity utilise MSBuild pour construire des solutions Visual Studio et lors de la compilation il y a l'avertissement suivant (fâcheusement plutôt bien enterré dans le journal):

[GetReferenceAssemblyPaths] C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Commun.CurrentVersion.cibles(1097, 5): avertissement MSB3644: La référence des assemblées cadre ".NETFramework,Version=v4.5.2" n'a été trouvé. Pour résoudre ce problème, installez le SDK ou le Pack de Ciblage pour cette version de framework ou réorienter votre demande pour une version du cadre pour lequel vous avez installé le SDK ou le Ciblage Pack installé. Notez que les assemblages seront résolus dans le Global Assembly Cache (GAC) et sera utilisé à la place de référence assemblées. Par conséquent, votre assemblée ne peut être correctement ciblée pour le cadre que vous le souhaitez.

Je peux confirmer que j'ai le .NET 4.5.2 Multi-Targeting Pack installé, mais je vais continuer à étudier

Il n'a rien à voir avec le installé .NET version, seule la référence assemblées de la matière. Notez comment vous n'avez pas 4.5.2 installé. Toujours un détail qui obtient fouilla mal sur la construction des machines, le référencement, les assemblées de c:\windows\microsoft.net au lieu de c:\program files (x86)\assemblies de référence est une erreur très commune. Pas de documenter le nom de la méthode manquante et un extrait du code qui l'utilise en fait assez difficile de vous aider.
merci pour l'aide. Je peux confirmer que j'ai toutes les références à Microsoft dll sans chemin d'accès spécifié (c'est à dire j'ai ajouté les références par les Assemblées dans l'onglet Ajouter des Références) et j'ai eu l'impression que ce serait de l'utiliser c:\program files (x86)\de référence comme vous le mentionnez. L'entrée de Journal des Événements ne fait pas mention d'une méthode spécifique au nom de tout ce qu'elle contient est limité StackTrace avec 2 méthodes à partir de mon code. J'ai ajouté dans l'information que j'ai de l'entrée de Journal des Événements
Tableau.Empty() est en effet un ajout de la méthode en 4.6. Nous ne pouvons pas voir comment il est arrivé là, sans la trace de la pile de votre débogueur fourni.
désolé, je n'ai ajouter dans mais les enlever à nouveau après je ne pense pas qu'il a aidé. J'ai trouvé que d'une autre bibliothèque qui avait été mise à jour a été construit contre 4,6 cependant, je suis revenue de ce et nous assistons encore à la question.
Vous avez raison, que la trace de la pile n'est pas utile. Il doit être celui qui est capturé avant votre code attiré l'exception. Comme ex.StackTrace ou celui que vous obtenez dans le débogueur lorsque vous cochez la Levée de case à cocher et désactiver Seulement Mon Code. Si votre DisplayExceptionInfo() méthode ne permet pas de montrer que vous voulez l'améliorer, ex.ToString() est toujours utile.

OriginalL'auteur Bijington | 2016-01-27