web-dev-qa-db-fra.com

Méthode non trouvée: 'System.String System.String.Format (System.IFormatProvider, System.String, System.Object)

J'ai un projet Web API 2 avec des pages d'aide qui s'exécute correctement localement mais génère cette erreur lorsque je le pousse vers Azure:

Méthode non trouvée: 'System.String System.String.Format (System.IFormatProvider, System.String, System.Object)

J'ai temporairement désactivé les erreurs personnalisées pour que la trace complète de la pile soit visible ici

L'erreur provient de cette ligne de code:

chaîne selectExpression = String.Format (CultureInfo.InvariantCulture, MethodExpression, GetMemberName (reflèteActionDescriptor.MethodInfo));

Voir ligne 96 ici

Le code source complet est disponible sur GitHub

Je ne sais même pas où aller avec celui-ci.

Merci d'avance pour votre aide.

22
Dale Alleshouse

Selon sa page MSDN , la surcharge que vous utilisez n'est prise en charge que sur .NET 4.6.

Configurez l'hôte pour exécuter .NET 4.6 ou remplacez le cadre cible du projet par 4.5 et recompilez.

Dans 4.5, il y a params object[] surcharge qui sera ensuite choisi, sans avoir à modifier votre code.

28
CodeCaster

Cela n'a aucun sens. Nous avons une ligne de code comme celle-ci dans notre application depuis 2009

String.Format(CultureInfo.CurrentCulture, "You must specify a new password of {0} or more characters.", _membershipService.MinPasswordLength);

Récemment, nous avons augmenté le projet en .NET 4.6 et maintenant, pour moi au moins, cette ligne rompt avec la même erreur. Donc, évidemment, la nouvelle surcharge casse quelque chose, et la méthode n'est pas nouvelle.

7
nportelli

Si vous ne pouvez ni mettre à niveau Host vers 4.6 ni rétrograder le projet vers 4.5, il existe une solution de contournement: passez un "objet []" comme arguments au lieu d'un "objet". Vous allez donc forcer l'utilisation de la surcharge "params object []". Exemple :

return string.Format(formatProvider, "{0:" + format + "}", new object[] { value });
7
bN_

Au cas où cela aiderait quelqu'un. Nous avons rencontré ce problème récemment après la mise à niveau de notre environnement de développement vers VS2015 (notre environnement cible est .Net 4)

Nos projets C++/clr n'avaient pas été correctement configurés pour utiliser le commutateur/clr, c'est-à-dire qu'ils n'étaient définis sur aucun support de langage commun, même si nous utilisions le clr. Cela n'a provoqué aucun problème avant la mise à niveau vers VS2015.

Je ne sais pas vraiment pourquoi cela fonctionne. Je suppose que le projet c ++/clr doit être lié à une version spécifique du runtime CLR au moment de la compilation. Je serais intéressé si quelqu'un pouvait expliquer cela plus clairement.

2
chrism233

Nous utilisons un serveur de construction personnalisé. Même si le projet TargetFrameworkVersion est v4.5.1, lorsque .net 4.6.1 est installé pour construire le serveur et qu'un seul argument est passé comme argument de format, le compilateur préfère utiliser cette surcharge

public static string Format(IFormatProvider provider, string format, object arg0)

au lieu de

public static string Format(IFormatProvider provider, string format, params object[] args)

La seule solution consiste à créer et à transmettre un argument de tableau

Exemple:

string.Format(CultureInfo.CurrentCulture, "Hello {0}", new[] { name });

1
ali kucuk

Azure Data Lake Analytics s'exécute sur .NET 4.5 aujourd'hui. Nous ne prenons donc pas en charge les scénarios d'assemblage .NET 4.6 et ce type d'erreurs est possible. Pour l'éviter, vous devez reconstruire votre assembly dans .NET 4.5.

La solution de contournement "non recommandée" suivante peut fonctionner avec un assembly .NET 4.6: Réécriture de string.Format(provider, format, arg0, arg1) dans string.Format(provider, format, new object[] { arg0, arg1 })

0
Matthieu Mezil