ASP.NET - domaine d'application.CurrentDomain.GetAssemblies() - Assemblages manquant après AppDomain redémarrer

J'ai un programme d'Amorçage qui regarde à travers toutes les Assemblées ASP.NET MVC de l'application pour trouver des types qui implémentent une IBootstrapperTask de l'interface, puis les enregistre avec un CIO Contrainer. L'idée est que vous pouvez litéralement placez votre IBootstrapperTasks n'importe où, et d'organiser vos Projets comment vous s'il vous plaît.

Code pour le programme d'Amorçage:

public class Bootstrapper
{
    static Bootstrapper()
    {
        Type bootStrapperType = typeof(IBootstrapperTask);

        IList<Assembly> assemblies = AppDomain.CurrentDomain.GetAssemblies();

        List<Type> tasks = new List<Type>();

        foreach (Assembly assembly in assemblies)
        {
            var types = from t in assembly.GetTypes()
                        where bootStrapperType.IsAssignableFrom(t)
                            && !t.IsInterface && !t.IsAbstract
                        select t;

            tasks.AddRange(types);
        }

        foreach (Type task in tasks)
        {
            if (!IocHelper.Container().Kernel.HasComponent(task.FullName))
            {
                IocHelper.Container().AddComponentLifeStyle(
                    task.FullName, task, LifestyleType.Transient);
            }
        }
    }

    public static void Run()
    {
        //Get all registered IBootstrapperTasks, call Execute() method
    }
}

Après une création complète, AppDomain.CurrentDomain.GetAssemblies() retourne toutes les Assemblées dans ma solution (y compris tous les GAC un s, mais qui ne me dérange pas).

Toutefois, si le domaine d'application est redémarrée, ou I 'rebond' du Web.Fichier de configuration (ajout d'un espace et d'économie), le constructeur statique est exécuté à nouveau, mais quand AppDomain.CurrentDomain.GetAssemblies() est appelé, la plupart des Assemblées sont manquants, dont l'un contenant mon IBootstrapperTask types.

Comment puis-je contourner ce problème? Je suppose que je pourrais Système.IO le répertoire /bin et le chargement de tous les Dll dans il manuellement, mais plutôt éviter cette situation, si possible, ou est-ce le seul moyen? Suis-je prendre la bonne approche générale de cette?

C'est un ASP.NET MVC 2.0 de l'application en cours d'exécution sur .NET 4.0, je reçois ce problème avec Visual Studio 2010 serveur web Cassini, et avec IIS7.0 dans le Pipeline Intégré Mode sur Windows Server 2008.


Edit: je viens de tomber sur ce post DONC La différence entre le domaine d'application.GetAssemblies et BuildManager.GetReferencedAssemblies qui dit que le domaine d'application ne charge que les Assemblées comme ils sont nécessaires (par exemple. lorsqu'une méthode/classe de cette Assemblée est d'abord appelée). Je pense que cela pourrait expliquer pourquoi les Assemblées sont manquants sur AppDomain.CurrentDomain.GetAssemblies() que le programme d'Amorçage est très tôt.

J'ai remarqué que si j'ai placé un appel à "quelque chose" à partir de l'Assembly manquant avant le programme d'Amorçage par exemple:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        MyApp.MissingAssembly.SomeClass someClass =
            new MyApp.MissingAssembly.SomeClass();

        Bootstrapper.Run();
    }
}

...il semble résoudre le problème, mais c'est un peu un hack.

  • Belle question et de la réponse! A pris un tour de vous blog - vous écrire quelques bonnes choses.