Pregunta

¿Hay alguna forma de obtener todas las ensamblajes que dependen de un ensamblaje determinado?

Seudo:

Assembly a = GetAssembly();
var dependants = a.GetDependants();
¿Fue útil?

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:

  1. Todos los ensambles en el directorio bin de mi aplicación

  2. Todos los ensamblajes en el directorio bin de mi aplicación + todos los ensamblajes en el GAC

  3. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top