web-dev-qa-db-fra.com

comment charger tous les assemblys depuis votre répertoire / bin

Dans une application Web, je veux charger tous les assemblys dans le répertoire/bin.

Étant donné que cela peut être installé n'importe où dans le système de fichiers, je ne peux pas garantir un chemin spécifique où il est stocké.

Je veux une liste <> d'objets d'assemblage d'assemblage.

39
mrblah

Eh bien, vous pouvez pirater cela vous-même avec les méthodes suivantes, utilisez d'abord quelque chose comme:

string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

pour obtenir le chemin vers votre Assemblée actuelle. Ensuite, parcourez toutes les DLL du chemin à l'aide de la méthode Directory.GetFiles avec un filtre approprié. Votre code final devrait ressembler à:

List<Assembly> allAssemblies = new List<Assembly>();
string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

foreach (string dll in Directory.GetFiles(path, "*.dll"))
    allAssemblies.Add(Assembly.LoadFile(dll));

Veuillez noter que je n'ai pas testé cela, vous devrez peut-être vérifier que la DLL contient réellement le chemin complet (et concaténer le chemin si ce n'est pas le cas)

45
Wolfwyrd

Vous pouvez le faire comme ceci, mais vous ne devriez probablement pas tout charger dans le domaine d'application actuel comme ceci, car les assemblys peuvent contenir du code nuisible.

public IEnumerable<Assembly> LoadAssemblies()
{
    DirectoryInfo directory = new DirectoryInfo(@"c:\mybinfolder");
    FileInfo[] files = directory.GetFiles("*.dll", SearchOption.TopDirectoryOnly);

    foreach (FileInfo file in files)
    {
        // Load the file into the application domain.
        AssemblyName assemblyName = AssemblyName.GetAssemblyName(file.FullName);
        Assembly assembly = AppDomain.CurrentDomain.Load(assemblyName);
        yield return Assembly;
    } 

    yield break;
}

EDIT: Je n'ai pas testé le code (pas d'accès à Visual Studio sur cet ordinateur), mais j'espère que vous aurez l'idée.

6
Patrik Svensson