2015-10-27 13 views
5

私のアプリケーションは、時折例外をスローResourceManager.GetString呼び出す:InvalidOperationExceptionが

例外タイプ:InvalidOperationException例外メッセージ: コレクションが変更されました。列挙操作が実行されないことがあります。

そして、ここでスタックトレース

Exception type: InvalidOperationException 
    Exception message: Collection was modified; enumeration operation may not execute. 
    at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) 
    at System.Reflection.RuntimeAssembly.InternalGetSatelliteAssembly(String name, CultureInfo culture, Version version, Boolean throwOnFileNotFound, StackCrawlMark& stackMark) 
    at System.Resources.ManifestBasedResourceGroveler.GetSatelliteAssembly(CultureInfo lookForCulture, StackCrawlMark& stackMark) 
    at System.Resources.ManifestBasedResourceGroveler.GrovelForResourceSet(CultureInfo culture, Dictionary`2 localResourceSets, Boolean tryParents, Boolean createIfNotExists, StackCrawlMark& stackMark) 
    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) 

そして、ここに私のコードですです:

public IList<Function> MapWithLanguage(IList<Function> list) 
{ 
    if (list == null) 
    { 
     return null; 
    } 
    var currentResource = Type.GetType("Fanex.Athena.Models.ViewModel.Menu, Fanex.Athena.Models"); 
    ResourceManager rm = new ResourceManager(currentResource); 
    var newList = new List<Function>(); 
    foreach (var func in list) 
    { 
     newList.Add(new Function 
     { 
      Name = rm.GetString("Menu_" + func.FunctionId), 
     }); 
    } 
    return newList; 
} 

誰も助けることができる、それはとても奇妙です?!

+1

ショーの呼び出しコード – Backs

+0

からシェアを行いますこの例外が生成された場所。 – Prabhat

+0

私はちょうど私のコードを更新しました!、見てください@Backs –

答えて

2

長時間のチェックの後、私は根本原因を発見しました。この方法は、このような「web_adg_gfgt_dfd.dll」として生成されたアセンブリをロードしようとIISはそれを修正する。だからをリサイクルするとき、彼らは削除することができ、我々は唯一の負荷を避けるために必要があるため

AppDomain.CurrentDomain.GetAssemblies(). 

: そして、ここでは問題では上記の私のコードの原因です"生成されたアセンブリ"。

したがって、我々は固定用の2つの方法があります。

1.Filter "生成されたアセンブリ":

AppDomain.CurrentDomain.GetAssemblies().Where(i => i.IsDynamic == false).ToList() 

は、このメソッドを2.Using:

BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToList() 
+2

ニースキャッチ! MSの誰かが、これが本当に 'ResourceManager.GetString'エラーの問題に関係しているかどうか、それが.net 4ランタイムのバグであるかどうかを確認できればさらに良いでしょう。私は少なくとも.net 2ランタイムを対象としているときにこの問題を抱えていませんでした。ターゲットフレームワーク3.5から4.6に切り替えた後で初めてこれを見始めました。ありがとう! – Fede

+0

@Alex Nguyen質問 – cosset

+0

からコードスニペットに「AppDomain.CurrentDomain.GetAssemblies()」が表示されない同じ例外がありますが、AppDomain.CurrentDomain.GetAssemblies()を呼び出さないでください。 – cosset

-1

実際はInvalidOperationException例外メッセージ:コレクションが変更されました。列挙操作が実行されない可能性があります。

foreachを使用してコレクションの要素をループしながら変更しています。

これはあなたの問題を解決するはずだと思います。

foreach (var func in list.ToList()) 
{ 
//Do your stuff 
} 
+0

これを試しましたか? –

関連する問題