私のコード:
System.Resources.ResourceManager resourceManager = GetResourceManager();
string str = resourceManager.GetString("delete", new CultureInfo(1033));
.NET 2.0 でコンパイルされた現在のプロジェクトでは、すべてが例外として機能します。変数strには LCID 1033 - Deleteのリソース文字列が含まれています。これで問題ありません。
現在、ターゲット フレームワーク .NET 4.0 で再コンパイルされたプロジェクトを .NET 4.0 にアップグレードしています。.NET 4.0 アセンブリとしてコンパイルされるようになったので、例外System.ArgumentNullExceptionがスローされ、 Value cannot be nullというメッセージが表示されます。。スタックトレース:
at System.Threading.Monitor.Enter(Object obj)
at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo requestedCulture, Boolean createIfNotExists, Boolean tryParents, StackCrawlMark& stackMark)
at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents)
at System.Resources.ResourceManager.GetString(String name, CultureInfo culture)
ここで興味深いのはスタックトレースです。これはResourceManager.InternalGetResourceSetの内部フレームワーク メソッドを指し、これによりnull オブジェクトでMonitor.Enterが呼び出されます。しかし、null パラメーターではないメソッドGetString ("delete", new CultureInfo(1033))を呼び出します。
このバグは System.Threading.Monitor.Enter の System.ArgumentNullException に似ているようです。多分 Monitor.Enter のバグか何か?
更新: デバッガーでオブジェクトを見ると、resourceManager.ResourceSets.Items[2].Value.Table["delete"]
文字列値 "Delete" が含まれています。プロパティ Items[2] ここでは LCID 1033 を指しています。これは、リソース マネージャーに、言語1033でリソース キーを削除するためのローカライズされた文字列が既に含まれていることを意味します。どこでエラーが発生するか知っている人はいますか?