【问题标题】:Unit Tests Failure in TFS Build Machine Due to AppDomain.CurrentDomain由于 AppDomain.CurrentDomain 导致 TFS 构建机器中的单元测试失败
【发布时间】:2012-08-13 01:23:57
【问题描述】:

我的单元测试没有在我的 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 属性 了解更多信息..

知道为什么吗?

【问题讨论】:

  • 您是否尝试过捕获异常并查看 LoaderExceptions 属性中的内容?
  • 这是 LoaderExceptions 中的异常(请记住,我使用的是 TFS Express Beta (2011):无法加载文件或程序集 'Microsoft.VisualStudio.TeamSystem.Licensing,版本 = 11.0。 0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。(来自 HRESULT 的异常:0x80131040)

标签: testing build tfs


【解决方案1】:

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

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

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

感谢您的提示。

【讨论】:

  • 我遇到了完全相同的问题,但我已经没有在 GAC 上使用程序集了……不幸的是,您的建议对我不起作用。还有其他你熟悉的解决方法吗?
【解决方案2】:

就我而言,唯一无法加载的程序集是 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);

【讨论】:

    【解决方案3】:

    我也遇到了这个问题,但@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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-29
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 2011-09-17
      • 2012-12-13
      • 2020-07-18
      相关资源
      最近更新 更多