由于AppDomain.CurrentDomain,TFS Build Machine中的单元测试失败

时间:2012-08-16 16:18:38

标签: testing build tfs

我遇到的问题是我的单元测试没有在我的TFS Build Machine中运行,尽管它们在我的开发者机器上运行。

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

    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属性   了解更多信息..

知道为什么吗?

3 个答案:

答案 0 :(得分: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();

这是一项工作,但为我做了工作。

感谢您的提示。

答案 1 :(得分:1)

就我而言,唯一无法加载的程序集是Microsoft.VisualStudio.TeamSystem.Licensing,它是Microsoft.VisualStudio.QualityTools.Common的依赖项。

基于Osel Miko Dřevorubec's answer,我提出了这个更安全的策略:

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);

答案 2 :(得分: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/