[英]Microsoft.Web.Administration (for IIS7 automation) doesn't work in VS 2010
[英]ReflectionTypeLoadException for Microsoft.Web.Administration running Test Project in VS2010
我们最近已将所有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中的另一种类型。 我已经阅读了一些书,并意识到Administration dll是IIS7的一部分。 我在XP上进行开发,没有安装IIS7。
我的真正问题是-为什么在我的应用程序域中的Microsoft.VisualStudio.Enterprise.AspNetHelper在VS2010测试中而不在VS2008测试中? 创建一个简单的控制台应用程序执行相同的操作似乎没有问题-仅对于测试项目。 我该如何解决?
这有点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;
}
我认为TODO已经说明了一切...但是我还没有找到更好的方法:-)
我在Win7测试实验室计算机上运行某些测试时遇到相同的问题,但是我无法在Server 2008 R2工作站上进行复制。 我没有启用IIS服务器角色,但是Microsoft.Web.Administration在我的GAC中-我认为这就是为什么测试在我本地通过的原因。
如果我用GetExportedTypes()代替GetTypes(),则可以解决此问题。 如果不需要内部类型,这是一个简单的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.