サードパーティ製のライブラリをアップグレードしましたが(復帰してもエラーは修正されませんでした)、実行時にプロジェクトにリソース例外が発生しました。問題のライブラリの名前空間を確認し、culture \ lib.resource.dllファイルがあることを確認しました。プロジェクトのカルチャが実際には私が予想している文化ですが、このエラーが起きていることを確認しました。これをどのようにデバッグできますか? .Netが自分のリソースファイルを検索している場所を知るにはどうすればいいですか?異常なMissingManifestResourceException
アップデート#1
エラー:
Could not find any resources appropriate for the specified
culture or the neutral culture. Make sure "My.Library.MyType.resources"
was correctly embedded or linked into assembly "My.Library" at compile
time, or that all the satellite assemblies required are loadable and
fully signed.
スタックトレース:
at System.Resources.ManifestBasedResourceGroveler.HandleResourceStreamMissing(String fileName)
更新#2
だから、それはいくつかの理由でRESOURCことが表示されますeマネージャは、ライブラリごとではなくタイプごとに特定のリソースファイルを検索しようとしています。
したがって、en-usローカライズされたフォルダ内に存在するMyLibrary.resourcesを検索するのではなく、存在しないMyLibrary.SpecificType.resourcesを検索しています。私は同じ問題を抱えていない同じプロジェクトに別の図書館を持っています。私はこの問題を引き起こす2つの違いを見つけることはできません。どのようにこれをデバッグできますか?
アップデート#3
[OK]を、ので、私は最終的にあきらめたとフレームワークのコードをデバッグすることを決めたと私は完全にカバーの下で起こっていることで困惑しています、ここで原因となっているように見えるコードがありますresourcemanager.csからの問題、:私はそれを調べるときに、ライン652上だから、
647 // WARNING: This function must be kept in sync with ResourceFallbackManager.GetEnumerator()
648 // Return the first ResourceSet, based on the first culture ResourceFallbackManager would return
648 internal ResourceSet GetFirstResourceSet(CultureInfo culture)
650 {
651 // Logic from ResourceFallbackManager.GetEnumerator()
652 if (_neutralResourcesCulture != null && culture.Name == _neutralResourcesCulture.Name)
653 {
654 culture = CultureInfo.InvariantCulture;
655 }
656
657 if(_lastUsedResourceCache != null) {
658 lock (_lastUsedResourceCache) {
659 if (culture.Name == _lastUsedResourceCache.lastCultureName)
660 return _lastUsedResourceCache.lastResourceSet;
661 }
662 }
は、culture.Nameは "EN-US" です。そして、659行目でコンテクストが明らかに変わることなく、culture.NameはEMPTY STRINGになります。何 ?!?!
これはどのように可能ですか?その後、文化固有のリソースがロードされていないので、すべてが論理的であるように見えます。しかし、どのように地球上の価値を割り当てるコードなしで文化 "en-US"から空の文字列に行くのでしょうか?
[OK]を更新#4
は、消去法により、コードがライン654にデバッガを行っているしなければならないようであればブロック飛ばしていたので、私はそれが実行されなかったと仮定し(そしてあなた彼らが仮定について何を言うか知っている)。ただし、その行にブレークポイントを設定しようとすると、ブレークポイントのバインディングエラーが発生します。私はそれを修正する方法はわかりませんが、なぜリソースを明示的に指定した場合、あなたのカルチャを不変にリセットするのでしょうか?私はここで非常に混乱しています。また、659行には、空の文字列とnullの比較があります。私の前回のC#の経験から、これはfalseでなければならず、660行が実行されましたか?
更新#5
[OK]を、おそらくそれは、モジュール内のコードが同じDLL内に含まれるローカライズされたリソースをロードしようとしたときに起こっている私は不足しているリソース・エラー4. PRISMを使用していますことを言及する価値がありますモジュール。テストとして、別のライブラリに関連付けられたローカライズされたリソースを持つダミーの列挙型を作成しました。私がどのようにリソースを作成し、構成し、ロードしたかについては、モジュール内の列挙型とまったく同じであり、リソースが別のDLLにある限り、動作するようです。