C'è un modo per ottenere tutti gli assiemi che dipendono da un determinato assieme?Ottenere gli assembly dipendenti?
Pseudo:
Assembly a = GetAssembly();
var dependants = a.GetDependants();
C'è un modo per ottenere tutti gli assiemi che dipendono da un determinato assieme?Ottenere gli assembly dipendenti?
Pseudo:
Assembly a = GetAssembly();
var dependants = a.GetDependants();
Se si desidera trovare l'assembly dipendenti dal dominio applicazione corrente, si potrebbe usare qualcosa come la funzione GetDependentAssemblies
definito di seguito:
private IEnumerable<Assembly> GetDependentAssemblies(Assembly analyzedAssembly)
{
return AppDomain.CurrentDomain.GetAssemblies()
.Where(a => GetNamesOfAssembliesReferencedBy(a)
.Contains(analyzedAssembly.FullName));
}
public IEnumerable<string> GetNamesOfAssembliesReferencedBy(Assembly assembly)
{
return assembly.GetReferencedAssemblies()
.Select(assemblyName => assemblyName.FullName);
}
Il parametro analyzedAssembly
rappresenta il gruppo per il quale si desidera trovare tutte le a carico.
Tutti, incluso me, sono pazzi perché niente ci pensa. Dritto e semplice. – Shimmy
+1 Nizza. Non avevo mai visto Assembly.GetReferencedAssemblies() prima. Sembra che sia stato aggiunto in .Net 4. Beh, impari qualcosa ogni giorno. –
Programatically, è possibile utilizzare Mono.Cecil per fare questo.
Qualcosa di simile (notare che questo non funzionerà se il debugger è attaccato - ad esempio, se lo si esegue da dentro VS stesso):
public static IEnumerable<string> GetDependentAssembly(string assemblyFilePath)
{
//On my box, once I'd installed Mono, Mono.Cecil could be found at:
//C:\Program Files (x86)\Mono-2.10.8\lib\mono\gac\Mono.Cecil\0.9.4.0__0738eb9f132ed756\Mono.Cecil.dll
var assembly = AssemblyDefinition.ReadAssembly(assemblyFilePath);
return assembly.MainModule.AssemblyReferences.Select(reference => reference.FullName);
}
Se non avete bisogno di fare questo programatically, quindi NDepend o Reflector può darti queste informazioni.
Il tuo codice restituisce un elenco di assiemi a cui fa riferimento un assembly indicato da 'assemblyFilePath', non è vero? E 'questo ciò che l'OP sta chiedendo? Penso (forse erroneamente) che l'OP voglia l'opposto: dato un assembly 'A' trova tutti gli assembly che lo fanno riferimento. Mi sto perdendo qualcosa? –
ahh - forse hai ragione - non sono sicuro ora.Dipende se leggi il titolo (che suggerisce cosa ho risposto qui), o la descrizione del testo (che suggerisce che hai ragione)! –
D'accordo, è un po 'confuso. Ma se ho ragione, allora l'OP deve probabilmente rispondere alla domanda sollevata da StaWho nei commenti prima! Non vedo altro modo per risolvere il problema che cercare tutti gli assembly nello "scope" ed eseguire il codice per ognuno di essi. –
Non sono a conoscenza di alcuna possibilità integrata per ottenere le dipendenze in fase di esecuzione. Quindi penso che la soluzione più semplice sia definire un metodo di estensione e utilizzare il codice dall'applicazione this. Ho usato un'applicazione stessa alcuni anni fa. Ma non utilizzare il codice.
Spero che questo aiuti.
Prima di definire l'ambito, ad esempio:
Tutti i gruppi nella directory bin della mia applicazione
Tutti i gruppi nella directory bin della mia applicazione + tutti gli assembly nella Global Assembly Cache
Tutti i gruppi su qualsiasi macchina del mondo.
Quindi semplicemente (*) scorrere tutti gli assiemi nel proprio ambito e utilizzare il riflesso per verificare se dipendono dall'assieme di destinazione.
Se si desiderano riferimenti indiretti e diretti, è necessario eseguire il risciacquo e ripetere per tutti gli assemblaggi che si trovano.
(*) Potrebbe non essere così semplice se l'ambito è 3 sopra.
Ne hai bisogno programmaticamente? Altrimenti puoi usare MS Depends per questo. –
Programmaticamente. Devo usare [AddProviderTransparent] (http://msdn.microsoft.com/en-us/library/dd783170.aspx) su tutti i tipi dipendenti. – Shimmy
Come definiresti l'ambito? Il montaggio può sapere da cosa dipende, ma può dire che cosa dipende da questo? +1 per domanda;) – StaWho