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