2016-05-19 31 views
7

migrare la mia app Web da RC1 di ASP.NET Core a RC2. Sto cercando di caricare le mie librerie di classi di riferimento.Come caricare gli assembly in ASP.NET Core 1.0 RC2

Questo snippet di codice non funziona più con RC2.

public class Startup 
{ 
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     // libraryManager is null .... 
     ILibraryManager libraryManager = app.GetService<ILibraryManager>(); 

     List<Assembly> result = new List<Assembly>(); 

     IEnumerable<Library> libraries = libraryManager.GetLibraries(); 

     IEnumerable<AssemblyName> assemblyNames = libraries.SelectMany(e => e.Assemblies).Distinct(); 
     assemblyNames = Enumerable.Where(assemblyNames, e => e.Name.StartsWith("projectNamespace")); 

     foreach (AssemblyName assemblyName in assemblyNames) 
     { 
      Assembly assembly = Assembly.Load(assemblyName); 
      . 
      . 
      . 
     } 
    } 
} 

Il nostro aiuto sarebbe molto apprezzato, grazie Stefan

+0

Che tipo di errore vuoi arrivare? – jeteon

+0

nessun errore .... ma app.GetService () restituisce null – stevo

risposta

12

ho trovato una soluzione. Sto usando ora DependencyContext invece di ILibraryManager

var loadableAssemblies = new List<Assembly>(); 

var deps = DependencyContext.Default;    
foreach (var compilationLibrary in deps.CompileLibraries) 
{ 
    if (compilationLibrary.Name.Contains(projectNamespace)) 
    { 
     var assembly = Assembly.Load(new AssemblyName(compilationLibrary.Name)); 
     loadableAssemblies.Add(assembly); 
    } 
} 
+0

Grazie, mi ha risparmiato un sacco di tempo :-) –

+0

Grazie! ho impiegato un po 'per capirlo. – Charles

+0

Nel mio programma DependencyContext.Default si risolve in null. Qualche suggerimento perché questo potrebbe accadere? –

4

Credo Stevo ha fatto 2 presupposti errati:

1) che namespace progetto dovrebbe essere parte del nome della libreria compilazione.
2) il nome della libreria di compilazione è lo stesso del nome binario.

Il primo è errato quando lo si modifica nelle impostazioni del progetto. Il secondo è sbagliato quando lo specifichi in buildOptions in project.json.

Quindi la tua idea è corretta ma l'implementazione è sbagliata. Per risolvere il problema dobbiamo dimenticare di risolvere per namespace finché non viene caricato l'assembly.
Suppongo che poiché tutti gli assiemi verranno caricati in ogni caso non otterremo grandi ritardi di prestazioni.

Ma non è una panacea ... l'assembly può avere più domini di root all'interno! Quindi forse il modo migliore sarà quello di definire alcuni attributi a livello di assembly e controllarli invece di namespace.

In ogni caso, se si vuole limitare la ricerca di assemblaggio, difficile avere fatto in questo modo:

IEnumerable<AssemblyName> names = DependencyContext.Default.GetDefaultAssemblyNames(); 

foreach (AssemblyName name in names) 
{ 
    if (name.Name.StartsWith("MyRoot") == true) 
    { 
     Assembly assembly = Assembly.Load(name); 

     // Process assembly here... 
     // I will check attribute for each loaded assembly found in MyRoot. 
    } 
} 
+0

Una leggera variazione su questo approccio ha funzionato per me, evviva. :) – Tagc