subdirectorios puede permiso error directorios directorio denegado crear carpeta c# assemblies

c# - puede - error al crear la carpeta permiso denegado



cómo cargar todos los ensambles desde su directorio/bin (4)

Bueno, puedes hackear esto junto con los siguientes métodos, inicialmente usa algo como:

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

para obtener el camino a su ensamblaje actual. A continuación, itere sobre todas las DLL en la ruta utilizando el método Directory.GetFiles con un filtro adecuado. Tu código final debería verse así:

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

Tenga en cuenta que no he probado esto, por lo que es posible que deba verificar que dll realmente contenga la ruta completa (y concatenar la ruta si no lo hace)

En una aplicación web, quiero cargar todos los ensamblados en el directorio / bin.

Como esto se puede instalar en cualquier lugar del sistema de archivos, no puedo garantizar una ruta específica donde se almacena.

Quiero una lista <> de objetos de conjunto de ensamblaje.


Para obtener el directorio bin, string path = Assembly.GetExecutingAssembly().Location; NO siempre funciona (especialmente cuando el ensamblaje en ejecución se ha colocado en un directorio temporal de ASP.NET).

En su lugar, debe usar string binPath = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "bin");

Además, probablemente deberías tener en cuenta FileLoadException y BadImageFormatException.

Aquí está mi función de trabajo:

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 }


Puede hacerlo así, pero probablemente no debería cargar todo en el dominio de aplicación actual de esta manera, ya que los ensamblados pueden contener código dañino.

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

EDITAR: No he probado el código (no tengo acceso a Visual Studio en esta computadora), pero espero que entiendas la idea.


Sé que esta es una vieja pregunta, pero ...

System.AppDomain.CurrentDomain.GetAssemblies ()