2010-08-03 5 views
2

Nous avons récemment mis à niveau tous nos projets VS2008 vers VS2010. Notre base de code cible toujours la version 3.5 du framework, mais je suis sûr que la plupart d'entre vous savent que les projets de test doivent être mis à niveau vers la version 4.0 du framework.ReflectionTypeLoadException pour Microsoft.Web.Administration exécutant le projet de test dans VS2010

Nous avons un ensemble particulier de tests qui ne fonctionnent pas maintenant que le projet de test cible le framework 4.0. Ces tests testent tous le code qui effectue une sorte de tâche de réflexion. Grâce à un peu de débogage, j'ai réussi à réduire le problème.

Pour une raison quelconque dans le projet de test mis à jour le code suivant:

AppDomain.CurrentDomain.GetAssemblies(); 

renvoie une référence à "Microsoft.VisualStudio.Enterprise.AspNetHelper". Si je puis appeler

GetTypes() 

sur cet ensemble, je reçois un ReflectionTypeLoadException disant qu'il ne peut pas charger l'assemblage « Microsoft.Web.Administration ». Il me semble donc qu'il y a un type dans "Microsoft.VisualStudio.Enterprise.AspNetHelper" qui hérite ou a une référence à un autre type dans Microsoft.Web.Administration. J'ai fait un peu de lecture et de réaliser la DLL d'administration fait partie de IIS7. Je développe sur XP et n'ai pas installé IIS7.

Ma vraie question est - pourquoi Microsoft.VisualStudio.Enterprise.AspNetHelper dans mon domaine d'application dans les tests VS2010, mais pas dans les tests VS2008? Créer une application de console simple qui fait la même chose ne semble pas être un problème - seulement avec des projets de test. Comment puis-je contourner cela?

Répondre

1

J'ai le même problème avec certains tests qui s'exécutent sur une machine de laboratoire de test Win7, mais je ne peux pas repro sur mon poste de travail Server 2008 R2. Je n'ai pas le rôle serveur IIS activé, mais Microsoft.Web.Administration est dans mon GAC - je pense que c'est pourquoi les tests passent localement pour moi.

Si je remplace GetExportedTypes() pour GetTypes(), je suis capable de contourner ce problème. C'est une solution facile si vous n'avez pas besoin de types internes.

3

Il est un peu hacky mais le tour est joué: (. Taken de TinyIoC - tout le crédit à Steven Robbins)

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; 
} 

Je pense que le TODO dit tout ... mais je n'ai pas encore trouvé de meilleure solution :-)

Questions connexes