找不到方法:' System.String System.String.Format(System.IFormatProvider,System.String,System.Object)

时间:2015-05-31 14:54:30

标签: c# asp.net azure asp.net-web-api2

我有一个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

上找到

我甚至不知道该去哪儿。

提前感谢您的帮助。

6 个答案:

答案 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 })