簡體   English   中英

在VS2010中運行測試項目的Microsoft.Web.Administration的ReflectionTypeLoadException

[英]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;
}

(摘自TinyIoC-所有版權歸史蒂芬·羅賓斯所有。)

我認為TODO已經說明了一切...但是我還沒有找到更好的方法:-)

我在Win7測試實驗室計算機上運行某些測試時遇到相同的問題,但是我無法在Server 2008 R2工作站上進行復制。 我沒有啟用IIS服務器角色,但是Microsoft.Web.Administration在我的GAC中-我認為這就是為什么測試在我本地通過的原因。

如果我用GetExportedTypes()代替GetTypes(),則可以解決此問題。 如果不需要內部類型,這是一個簡單的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM