2012-01-05 21 views
15

Con Visual Studio, puedo ver las referencias dll como la imagen adjunta como un ejemplo. Con esta información de referencia, puedo abrir el proyecto de composición (desde el ejemplo) para buscar todas las otras referencias para obtener todos los nombres de los archivos de referencia..NET DLL referencias/utilidad de comprobación de dependencia

¿Hay alguna utilidad que realice este trabajo automáticamente? Es decir, dado un ensamblado .NET, comprueba todas las referencias/dependencias recursivamente para dar los nombres de las DLL.

Comprobé cygwin's ldd y Depends.exe, pero no parecen mostrar los dlls de otros proyectos, pero solo dlls del sistema.

enter image description here

+1

Puede escribir fácilmente uno con Assembly.GetReferencedAssemblies(). Comience en el EXE. Por supuesto, tendrá que poder * encontrar * los archivos de ensamblaje, que pueden ser bastante complicados con los archivos .config y las políticas de editor. La razón por la cual no es una utilidad universal. –

Respuesta

19

Sí: ildasm.exe. Está instalado con el SDK.

debe estar en un camino como: C: \ Archivos de programa (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin

+0

pero solo muestra los dlls de ejercicio nativos. cómo ver los assembblies referenciados de .net? –

+5

Si hace doble clic en el Manifiesto, muestra los ensamblados referenciados de .NET:. Assembly extern System.Drawing { .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A) //.? _....: .ver 4: 0: 0: 0 } .assembly extern System.Data { .publickeytoken = (B7 7A 5C 56 19 34 E0 89) // .z \ V.4 .. .ver 4: 0: 0: 0 } –

+0

sí .. me confundí con http://stackoverflow.com/questions/18637173/how-is-the-net-referenced-assemblies-names-resolved-by-the-clr-at -runtime? noredirect = 1 # comment27463835_18637173 –

1

no sé de ninguna herramienta para hacer esto automáticamente, pero Puedo resumir los pasos que cualquier herramienta (o usted) debería seguir.

Cada conjunto contiene un manifiesto. El manifiesto enumera los nombres y las versiones de todos los demás ensamblajes de los que depende el ensamblaje actual. En su forma más simple, necesitarías seguir este camino recursivamente.

No hay una forma correcta de decirle los nombres de los archivos de los ensambles a los que se hace referencia. Las referencias se almacenan en el manifiesto como nombres de ensamblado (nombre, versión, cultura, etc.) y no como nombres de archivo. Cuando el tiempo de ejecución de .NET necesita cargar un ensamblado al que se hace referencia, usa varias búsquedas para encontrarlo, y el resultado de estas búsquedas puede variar de un entorno a otro. Por supuesto, esto podría no ser un problema para usted si solo está buscando ensamblajes en su máquina de desarrollo, por ejemplo.

Las técnicas para resolver referencias de ensamblado incluyen buscar ensamblados ya cargados, buscar en el Caché de ensamblados global, buscar en el directorio de aplicaciones, redirigir en función de los archivos de configuración de la aplicación o las políticas del editor, entre otros. Google para el artículo "Cómo el tiempo de ejecución localiza ensamblajes" en MSDN para más detalles. Además, su aplicación puede registrarse para hacer su propia resolución de referencia manejando el evento System :: AppDomain :: AssemblyResolve.

3

Puede utilizar el ildasm.exe proporcionado, o si quieres algo un poco más potente, que puede probar:

Reflector

Aún mejor, probar el libre:

dotPeek

saludos,

1

Thi El código hará un buen trabajo al encontrar todas las referencias. "temp" será un vertedero de todas las referencias que rastreó.

private void PerformReferenceAnalysis() 
    { 
     StringBuilder builder = new StringBuilder(); 
     HashSet<string> loadedAssemblies = new HashSet<string>(); 
     PerformReferenceAnalysis(System.Reflection.Assembly.GetExecutingAssembly(), builder, string.Empty, loadedAssemblies); 
     string temp = builder.ToString(); 
    } 

    private void PerformReferenceAnalysis(System.Reflection.Assembly assembly, StringBuilder builder, string leadingWhitespace, HashSet<string> loadedAssemblies) 
    { 
     if (builder.Length > 0) 
     { 
      builder.AppendLine(); 
     } 
     builder.Append(leadingWhitespace + assembly.FullName); 
     System.Reflection.AssemblyName[] referencedAssemblies = assembly.GetReferencedAssemblies(); 
     foreach (System.Reflection.AssemblyName assemblyName in referencedAssemblies) 
     { 
      if (loadedAssemblies.Contains(assemblyName.Name)) 
      { 
       continue; 
      } 
      loadedAssemblies.Add(assemblyName.Name); 
      System.Reflection.Assembly nextAssembly; 
      try 
      { 
       nextAssembly = System.Reflection.Assembly.ReflectionOnlyLoad(assemblyName.FullName); 
      } 
      catch (Exception) 
      { 
       try 
       { 
        nextAssembly = System.Reflection.Assembly.ReflectionOnlyLoad(assemblyName.Name); 
       } 
       catch (Exception) 
       { 
        nextAssembly = null; 
       } 
      } 
      if (nextAssembly != null) 
      { 
       PerformReferenceAnalysis(nextAssembly, builder, leadingWhitespace + "| ", loadedAssemblies); 
      } 
     } 
    } 
10

me gusta usar AsmSpy para este tipo de comprobación. Hay un solo exe para descargar y luego lo puse en mi carpeta de herramientas para facilitar el acceso. https://github.com/mikehadlow/AsmSpy

+3

+1 AsmSpy puede producir (utilizando -dg key) un archivo de salida en formato * .dgml que se puede abrir con Visual Studio 2013 o 2015. Cuando se abre en VS, ** puede buscarlo ** (Ctrl-F) para encontrar el dll de interés (por ejemplo, un dll faltante). Presione "I" para seleccionar todos los dlls que dependen de él. Luego haga R-Haga clic en el gráfico/Seleccionar/Invertir selección, presione Eliminar en su teclado, y podrá obtener un buen gráfico legible de dlls dependiendo de un dll que falte. Ni dotPeek ni ILSpy (el heredero de Reflector) podrían producir una lista de dependencias en formato de búsqueda. – farfareast

Cuestiones relacionadas