Метод не найден: 'System.String System.String.Format(System.IFormatProvider, System.String, System.Object)

У меня есть проект Web API 2 с страницами справки, которые работают нормально локально, но выдает эту ошибку, когда я нажимаю ее на Azure:

Метод не найден: 'System.String System.String.Format(System.IFormatProvider, System.String, System.Object)

Я временно отключил пользовательские ошибки, поэтому можно увидеть полную трассировку стека здесь

Ошибка возникает из этой строки кода:

string selectExpression = String.Format(CultureInfo.InvariantCulture, MethodExpression, GetMemberName (reflectionActionDescriptor.MethodInfo));

См. раздел 96 здесь

Полный исходный код доступен на GitHub

Я даже не уверен, куда идти с этим.

Заранее благодарим за помощь.

Ответы

Ответ 1

Согласно своей странице MSDN, используемая перегрузка поддерживается только на .NET 4.6.

Либо настройте хост для выполнения .NET 4.6, либо измените целевую структуру проекта на 4.5 и перекомпилируйте.

В 4.5 есть params object[] overload, который затем будет выбран без изменения вашего кода.

Ответ 2

Это не имеет смысла. В нашем приложении с 2009 года такая строка кода

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

Недавно мы повысили проект до .NET 4.6, и теперь, по крайней мере, для меня эта строка ломается с той же ошибкой. Таким образом, очевидно, что новая перегрузка что-то ломает, а метод не нов.

Ответ 3

Если вы не можете обновить хост до версии 4.6 или нисходящий проект до версии 4.5, это обходное решение: передать "объект []" в качестве аргументов вместо "объекта". Таким образом, вы будете принудительно использовать перегрузку объекта params object []. Пример:

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

Ответ 4

В случае, если это поможет кому угодно. Мы столкнулись с этой проблемой недавно после обновления нашей среды разработки до VS2015 (наша целевая среда -.Net 4)

Наши проекты С++/clr не были правильно настроены для использования переключателя /clr, т.е. они не были настроены на отсутствие поддержки общего языка, хотя мы использовали clr. Это не вызвало проблему, пока мы не перешли на VS2015.

Я не совсем понимаю, почему это работает. Im, предполагающий, что проект С++/clr должен связываться с определенной версией среды CLR во время компиляции. Мне интересно, может ли кто-нибудь объяснить это более четко.

Ответ 5

Мы используем пользовательский сервер сборки. Даже если проект TargetFrameworkVersion является v4.5.1, когда .net 4.6.1, установленный для сборки сервера, и один аргумент передается как аргумент формата, компилятор предпочитает использовать эту перегрузку

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

вместо

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

Только решение создает и передает аргумент массива

Пример:

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

Ответ 6

Azure Data Lake Analytics работает на .NET 4.5 сегодня. Поэтому мы не поддерживаем сценарии сборки .NET 4.6, и такие ошибки возможны. Чтобы избежать этого, вы должны перестроить свою сборку в .NET 4.5.

В сборке .NET 4.6 может работать следующее "не рекомендованное" решение: перезапись string.Format(provider, format, arg0, arg1) в string.Format(provider, format, new object[] { arg0, arg1 })