Подтвердить что ты не робот

Как загрузить все сборки из вашего каталога/bin

В веб-приложении я хочу загрузить все сборки в каталоге /bin.

Так как это можно установить где угодно в файловой системе, я не могу настроить конкретный путь, где он хранится.

Мне нужны объекты сборки List < > сборки.

4b9b3361

Ответ 1

Ну, вы можете взломать это вместе со следующими способами, изначально используйте что-то вроде:

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

чтобы получить путь к вашей текущей сборке. Затем перебираем по всей DLL путь, используя метод Directory.GetFiles с подходящим фильтром. Ваш последний код должен выглядеть так:

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

Обратите внимание, что я не тестировал это, поэтому вам может потребоваться проверить, действительно ли DLL содержит полный путь (и конкатенировать путь, если он этого не делает)

Ответ 2

Чтобы получить каталог bin, string path = Assembly.GetExecutingAssembly().Location; работает NOT (особенно, когда исполняющая сборка помещена во временный каталог ASP.NET).

Вместо этого вы должны использовать string binPath = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "bin");

Кроме того, вы, вероятно, должны учитывать исключения FileLoadException и BadImageFormatException.

Вот моя рабочая функция:

public static void LoadAllBinDirectoryAssemblies()
{
    string binPath = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "bin"); // note: don't use CurrentEntryAssembly or anything like that.

    foreach (string dll in Directory.GetFiles(binPath, "*.dll", SearchOption.AllDirectories))
    {
    try
    {                    
        Assembly loadedAssembly = Assembly.LoadFile(dll);
    }
    catch (FileLoadException loadEx)
    { } // The Assembly has already been loaded.
    catch (BadImageFormatException imgEx)
    { } // If a BadImageFormatException exception is thrown, the file is not an assembly.

    } // foreach dll
}

Ответ 3

Вы можете сделать это так, но вы, вероятно, не должны загружать все в текущее приложение, например, так как сборки могут содержать вредоносный код.

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: я не тестировал код (нет доступа к Visual Studio на этом компьютере), но я надеюсь, что вы получите эту идею.

Ответ 4

Я знаю, что это старый вопрос, но...

System.AppDomain.CurrentDomain.GetAssemblies()