我遇到的问题是我的单元测试没有在我的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属性 了解更多信息..
知道为什么吗?
答案 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);