第二次尝试在.net 4中进行反射时获取ReflectionTypeLoadException

时间:2010-08-25 15:27:00

标签: c# .net exception reflection .net-4.0

在我的项目中,我有以下帮助器方法,它遍历所有程序集并获取所有类型的BaseCamaFrom类型的子类。

    public static List<Type> GetAllTestActionFormTypes()
    {
        List<Type> types = new List<Type>();

        // add all the types that are subclasses of BaseCamaForm to the _camaFormType list
        foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
            foreach (Type t in asm.GetTypes())
                if (t.IsSubclassOf(typeof(BaseCamaForm)))
                    types.Add(t);

        return types;
    }

此方法在第一次调用时正常工作。但是,在第二次调用此方法时,调用asm.GetTypes()时会发生以下异常:

ReflectionTypeLoadException was unhandled by user code: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.

在查看LoaderException属性后,我找到了System.IO.FileLoadException,其中包含以下消息:

Mixed mode assembly is built against version 'v2.0.50727' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information.

为什么这段代码第一次被调用时会起作用,但第二次总是出现异常?

<小时/> 编辑:经过更多调查后,我引用的唯一具有运行时版本2.0.50727的程序集是Microsoft.TeamFoundation.Client和Microsoft.TeamFoundation.VersionControl.Client。我无法弄清楚为什么这些引用会导致反射问题,也不知道为什么它似乎仅在第二次尝试时发生。在尝试对某些类使用Activator.CreateInstance(types[x])调用时,似乎偶尔也会出现这种情况。

1 个答案:

答案 0 :(得分:2)

显然我必须将<startup useLegacyV2RuntimeActivationPolicy="true" />添加到我的app.config文件中。一旦我这样做,我不再发生反射异常。我仍然不知道为什么会这样做,但至少它是固定的。