2012-08-16 58 views
4

虽然它们在我的开发人员计算机上运行,​​但我的单元测试未在我的TFS构建计算机中运行,但仍遇到问题。由于AppDomain.CurrentDomain在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属性 以获取更多信息。

任何想法为什么?

+0

您是否尝试捕捉异常,看到了LoaderExceptions属性里面什么? – 2012-08-17 19:22:17

+0

这是LoaderExceptions中的异常(请记住,我正在使用TFS Express Beta(2011): 无法加载文件或程序集'Microsoft.VisualStudio.TeamSystem.Licensing,Version = 11.0.0.0,Culture = neutral ,publicKeyToken = b03f5f7f11d50a3a'或它的一个依赖关系,找到的程序集清单定义与程序集引用不匹配(异常来自HRESULT:0x80131040) – nirpi 2012-08-19 07:15:56

回答

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

这是一个解决办法,但做的工作对我来说。

感谢您的提示。

+0

我有完全相同的问题,但我已经没有在GAC上使用程序集...您的建议对我而言并不适用,是否还有其他解决方法您熟悉? – julealgon 2013-07-19 18:53:05

0

我还会见了thiss问题,但@nirpi条件didnt帮助了我,我用这个解决方案成功地:

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/

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