¿Obtener ensamblajes dependientes?
-
27-10-2019 - |
Pregunta
¿Hay alguna forma de obtener todas las ensamblajes que dependen de un ensamblaje determinado?
Seudo:
Assembly a = GetAssembly();
var dependants = a.GetDependants();
Solución
Si desea encontrar los conjuntos dependientes del dominio de la aplicación actual, podría usar algo como el GetDependentAssemblies
función definida a continuación:
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);
}
los analyzedAssembly
El parámetro representa el ensamblaje para el que desea encontrar todos los dependientes.
Otros consejos
Programáticamente, puede usar Mono.cecil para hacer esto.
Algo como esto (tenga en cuenta que esto no funcionará si se adjunta el depurador, por ejemplo, si lo ejecuta desde adentro frente a sí mismo):
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);
}
Si no necesita hacer esto programáticamente, entonces Nudarse o Reflector puede darle esta información.
Primero defina tu alcance, por ejemplo:
Todos los ensambles en el directorio bin de mi aplicación
Todos los ensamblajes en el directorio bin de mi aplicación + todos los ensamblajes en el GAC
Todos los ensambles en cualquier máquina del mundo.
Luego, simplemente (*) ite a través de todos los ensamblajes en su alcance y use la reflexión para verificar si dependen de su ensamblaje objetivo.
Si desea referencias indirectas y directas, tendrá que enjuagar y repetir para todos los ensamblajes que encuentre.
(*) Puede que no sea tan simple si su alcance es 3 arriba.
No conozco ninguna posibilidad incorporada para obtener dependencias en tiempo de ejecución. Así que creo que la solución más fácil es definir un método de extensión y usar código de este solicitud. Usé una aplicación en sí hace años. Pero no haga use el código del mismo.
Espero que esto ayude.