4

我遇到了一个问题,我的单元测试没有在我的 TFS 构建机器上运行,尽管它们在我的开发人员机器上运行。

我在以下行中遇到异常,尝试为特定接口加载所有已加载的程序集:

    var classesToMap = AppDomain.CurrentDomain.GetAssemblies().ToList()
        .SelectMany(s => s.GetTypes())
        .Where(p => typeof(IInterface).IsAssignableFrom(p) && p.IsClass).ToList();

例外是:

System.Reflection.TargetInvocationException:调用的目标已引发异常。---> System.Reflection.ReflectionTypeLoadException:无法加载一种或多种请求的类型。检索 LoaderExceptions 属性以获取更多信息。

知道为什么吗?

4

3 回答 3

2

通过添加条件以丢弃 GAC 中的所有 dll 来解决此问题:

 var classesToMap = AppDomain.CurrentDomain.GetAssemblies()
        .Where(a => !a.GlobalAssemblyCache)
        .SelectMany(s => s.GetTypes())
        .Where(p => typeof(IInterface).IsAssignableFrom(p) && p.IsClass).ToList();

这是一种解决方法,但对我有用。

感谢您的提示。

于 2012-08-19T07:43:22.627 回答
1

就我而言,唯一无法加载的程序集Microsoft.VisualStudio.TeamSystem.LicensingMicrosoft.VisualStudio.QualityTools.Common.

根据Osel Miko Dřevorubec 的回答,我想出了这个更安全的策略:

private static Type[] GetTypesFromAssemblySafe(Assembly assembly)
{
    var ignoredAssemblies = new List<string>()
        {
            "Microsoft.VisualStudio.QualityTools.Common" //Gives trouble in TFS automated builds
        };

    if (!ignoredAssemblies.Contains(assembly.FullName.Split(',')[0]))
        return assembly.GetTypes();
    else
        return new Type[] { };
}

var types = AppDomain.CurrentDomain.GetAssemblies()
    .ToList()
    .SelectMany(GetTypesFromAssemblySafe);
于 2015-08-21T13:59:25.933 回答
0

我也遇到了这个问题,但@nirpi 条件没有帮助我我成功地使用了这个解决方案:

private static Type[] GetTypesFromAssemblySafe(Assembly assembly) {
    try {
        return assembly.GetTypes();
    } catch {
        return new Type[] {};
    }
}

var types = AppDomain.CurrentDomain.GetAssemblies()
    .ToList()
    .SelectMany(GetTypesFromAssemblySafe);

来源:http ://www.kspace.pt/posts/dynamic-type-discovery/

于 2014-03-12T15:15:59.337 回答