2017-07-18 4 views
-1

サードパーティ製のライブラリをアップグレードしましたが(復帰してもエラーは修正されませんでした)、実行時にプロジェクトにリソース例外が発生しました。問題のライブラリの名前空間を確認し、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にある限り、動作するようです。

答えて

0

非常に奇妙な結果です。私は中立の文化のために定義されたリソースファイルを持っていなかったので、このエラーが起きているようです。だから私はSomeType.resxを持っていなかった、私はSomeType.en-us.resxしか持っていなかった。これはnet40で機能していたようですが、私が忘れていたのは、自分のナゲットパッケージをアップグレードしたときに、同時にdotNetバージョンを.net 4.6.1にアップグレードしたことです。すべてのリソースファイルの名前をSomeType.resxに変更すると、すべて正常に戻りました。