В веб-приложении я хочу загрузить все сборки в каталоге /bin.
Так как это можно установить где угодно в файловой системе, я не могу настроить конкретный путь, где он хранится.
Мне нужны объекты сборки List < > сборки.
В веб-приложении я хочу загрузить все сборки в каталоге /bin.
Так как это можно установить где угодно в файловой системе, я не могу настроить конкретный путь, где он хранится.
Мне нужны объекты сборки List < > сборки.
Ну, вы можете взломать это вместе со следующими способами, изначально используйте что-то вроде:
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 содержит полный путь (и конкатенировать путь, если он этого не делает)
Чтобы получить каталог 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
}
Вы можете сделать это так, но вы, вероятно, не должны загружать все в текущее приложение, например, так как сборки могут содержать вредоносный код.
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 на этом компьютере), но я надеюсь, что вы получите эту идею.
Я знаю, что это старый вопрос, но...
System.AppDomain.CurrentDomain.GetAssemblies()