ローカルで正常に実行されるヘルプページを含むWeb API 2プロジェクトがありますが、Azureにプッシュするとこのエラーがスローされます。
メソッドが見つかりません: 'System.String System.String.Format(System.IFormatProvider、System.String、System.Object)
完全なスタックトレースを表示できるように、一時的にカスタムエラーをオフにしました here
エラーは次のコード行から発生しています。
文字列selectExpression = String.Format(CultureInfo.InvariantCulture、MethodExpression、GetMemberName(reflectedActionDescriptor.MethodInfo));
96行目を参照してください こちら
完全なソースコードは GitHub で入手できます。
私はこれでどこに行くべきかさえ分かりません。
よろしくお願いします。
そのMSDNページ によると、使用しているオーバーロードは.NET 4.6でのみサポートされています。
.NET 4.6を実行するようにホストを構成するか、プロジェクトのターゲットフレームワークを4.5に変更して再コンパイルします。
4.5には params object[]
overload コードを変更することなく選択されます。
これは意味がありません。 2009年以来、アプリケーションに次のようなコード行がありました。
String.Format(CultureInfo.CurrentCulture, "You must specify a new password of {0} or more characters.", _membershipService.MinPasswordLength);
最近、プロジェクトを.NET 4.6にアップグレードしましたが、少なくとも私にとっては、この行は同じエラーで壊れています。したがって、明らかに、新しいオーバーロードは何かを壊し、メソッドは新しいものではありません。
ホストを4.6にアップグレードしたり、プロジェクトを4.5にダウングレードしたりできない場合は、回避策があります。「オブジェクト」の代わりに「オブジェクト[]」を引数として渡します。したがって、「params object []」オーバーロードの使用を強制します。例:
return string.Format(formatProvider, "{0:" + format + "}", new object[] { value });
これが誰にも役立つ場合。開発環境をVS2015にアップグレードした後、最近この問題が発生しました(ターゲット環境は.Net 4です)
C++/clrプロジェクトは、/ clrスイッチを使用するように正しくセットアップされていませんでした。つまり、clrを使用していても、共通言語サポートが設定されていませんでした。 VS2015にアップグレードするまで、これは問題を引き起こしませんでした。
これがなぜ機能するのか完全にはわかりません。 c ++/clrプロジェクトは、コンパイル時にCLRランタイムの特定のバージョンにバインドする必要があると思います。誰かがこれをより明確に説明できるかどうか興味があります。
カスタムビルドサーバーを使用しています。プロジェクト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 });
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 })
に書き換える