我们最近将所有VS2008项目升级到VS2010。我们的代码库仍然针对框架版本3.5,但我相信大多数人都知道测试项目必须升级到框架版本4.0。
我们有一组特定的测试,现在测试项目的目标是框架4.0。这些测试所有测试代码都在进行某种反射任务。通过一些调试,我设法缩小了问题。
出于某种原因,在升级的测试项目中,使用以下代码:
AppDomain.CurrentDomain.GetAssemblies();
将返回对“Microsoft.VisualStudio.Enterprise.AspNetHelper”的引用。如果我再打电话
GetTypes()
在这个程序集上我得到一个ReflectionTypeLoadException,说它无法加载程序集“Microsoft.Web.Administration”。
所以在我看来,“Microsoft.VisualStudio.Enterprise.AspNetHelper”中有一些类型,它继承或引用了Microsoft.Web.Administration中的另一种类型。我做了一些阅读,并意识到管理DLL是IIS7的一部分。我在XP上开发并且没有安装IIS7。
我真正的问题是 - 为什么在VS2010的应用程序域中的Microsoft.VisualStudio.Enterprise.AspNetHelper测试但在VS2008测试中没有?创建一个执行相同操作的简单控制台应用程序似乎不是问题 - 仅适用于测试项目。我该如何解决这个问题?
答案 0 :(得分:3)
这有点hacky但是诀窍:
AppDomain.CurrentDomain.GetAssemblies().Where(a => !IsIgnoredAssembly(a))
,其中
private bool IsIgnoredAssembly(Assembly assembly)
{
// TODO - find a better way to remove "system" assemblies from the auto registration
var ignoreChecks = new List<Func<Assembly, bool>>()
{
asm => asm.FullName.StartsWith("Microsoft.", StringComparison.InvariantCulture),
asm => asm.FullName.StartsWith("System.", StringComparison.InvariantCulture),
asm => asm.FullName.StartsWith("System,", StringComparison.InvariantCulture),
asm => asm.FullName.StartsWith("CR_ExtUnitTest", StringComparison.InvariantCulture),
asm => asm.FullName.StartsWith("mscorlib,", StringComparison.InvariantCulture),
asm => asm.FullName.StartsWith("CR_VSTest", StringComparison.InvariantCulture),
asm => asm.FullName.StartsWith("DevExpress.CodeRush", StringComparison.InvariantCulture),
asm => asm.FullName.StartsWith("IronPython", StringComparison.InvariantCulture),
asm => asm.FullName.StartsWith("IronRuby", StringComparison.InvariantCulture),
};
foreach (var check in ignoreChecks)
{
if (check(assembly))
return true;
}
return false;
}
(取自TinyIoC - 全部归功于Steven Robbins。)
我认为 TODO 说明了一切......但我还没有找到更好的方法: - )
答案 1 :(得分:1)
我在Win7测试实验室机器上运行的某些测试遇到了同样的问题,但是我无法在我的Server 2008 R2工作站上进行重新编译。我没有启用IIS服务器角色,但Microsoft.Web.Administration在我的GAC中 - 我认为这就是测试在本地传递给我的原因。
如果我将GetExportedTypes()替换为GetTypes(),我可以解决这个问题。如果您不需要内部类型,这是一个简单的解决方案。