我有一个Web API 2项目,其中包含可在本地运行良好的帮助页面但在将其推送到Azure时会抛出此错误:
找不到方法:' System.String System.String.Format (System.IFormatProvider,System.String,System.Object)
我暂时关闭了自定义错误,因此可以看到完整的堆栈跟踪here
错误源自这行代码:
string selectExpression = String.Format(CultureInfo.InvariantCulture,MethodExpression,GetMemberName(reflectActionDescriptor.MethodInfo));
见第96行here
完整源代码可在GitHub
上找到我甚至不知道该去哪儿。
提前感谢您的帮助。
答案 0 :(得分:28)
根据its MSDN page,您使用的重载仅在.NET 4.6上受支持。
将主机配置为运行.NET 4.6或将项目的目标框架更改为4.5并重新编译。
在4.5中有一个params object[]
overload然后将被选中,而不必改变你的代码。
答案 1 :(得分:7)
这没有意义。自2009年以来,我们在我们的应用程序中有一行代码
String.Format(CultureInfo.CurrentCulture, "You must specify a new password of {0} or more characters.", _membershipService.MinPasswordLength);
最近我们将项目升级到.NET 4.6,现在,至少对我来说,这一行打破了同样的错误。所以很明显,新的重载会破坏某些东西,而且这种方法并不新鲜。
答案 2 :(得分:6)
如果你既不能将主机升级到4.6也不能将项目降级到4.5,那么就有一种解决方法:传递一个"对象[]"作为args而不是"对象"。所以你将强制使用" params对象[]"超载。示例:
return string.Format(formatProvider, "{0:" + format + "}", new object[] { value });
答案 3 :(得分:2)
如果这有助于任何人。在将我们的开发环境升级到VS2015(我们的目标环境是.Net 4)
之后,我们最近遇到了这个问题我们的C ++ / clr项目没有正确设置使用/ clr开关,即使我们使用clr,它们被设置为没有公共语言支持。在我们升级到VS2015之前,这不会导致问题。
我不清楚为什么会这样。我猜测c ++ / clr项目必须在编译时绑定到特定版本的CLR运行时。如果有人能够更清楚地解释这一点,我会感兴趣。
答案 4 :(得分:1)
我们正在使用自定义构建服务器。即使项目TargetFrameworkVersion是v4.5.1,当.net 4.6.1安装到构建服务器并且单个参数作为format参数传递时,编译器更喜欢使用此重载
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 });
答案 5 :(得分:0)
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 })