InvalidOperationException调用ResourceManager.GetString时

Ale*_*yen 9 .net c# asp.net asp.net-mvc asp.net-mvc-4

我的应用偶尔抛出异常:

异常类型: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)
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?这太奇怪了!

Ale*_*yen 4

经过很长时间的检查,我找到了根本原因。这是我的代码导致上述问题的原因:

AppDomain.CurrentDomain.GetAssemblies().
Run Code Online (Sandbox Code Playgroud)

因为此方法尝试加载生成的程序集,例如“web_adg_gfgt_dfd.dll”,并且它们可以在 IIS 回收时被删除。因此要修复它,我们只需要避免加载“生成的程序集”即可。

因此我们有两种修复方法:

1.过滤“生成的程序集”:

AppDomain.CurrentDomain.GetAssemblies().Where(i => i.IsDynamic == false).ToList()
Run Code Online (Sandbox Code Playgroud)

2.使用此方法:

BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToList()
Run Code Online (Sandbox Code Playgroud)

  • 不错的收获!如果 MS 的某人能够验证这是否真的与“ResourceManager.GetString”错误相关,以及它是否是 .net 4 运行时中的错误,那就更好了。我至少在针对 .net 2 运行时时没有遇到这个问题。从目标框架 3.5 切换到 4.6 后才开始看到这一点。谢谢! (3认同)