在VS2010中运行Test Project的Microsoft.Web.Administration的ReflectionTypeLoadException

时间:2010-08-03 07:53:49

标签: c# visual-studio-2010 reflection

我们最近将所有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测试中没有?创建一个执行相同操作的简单控制台应用程序似乎不是问题 - 仅适用于测试项目。我该如何解决这个问题?

2 个答案:

答案 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(),我可以解决这个问题。如果您不需要内部类型,这是一个简单的解决方案。