Метод не найден: '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 })