Ответ 1
Да: ildasm.exe. Он устанавливается вместе с SDK.
Должно быть в пути, таком как: C:\Program Files (x86)\Microsoft SDK\Windows\v7.0A\Bin
В Visual Studio в качестве примера я вижу ссылки dll в качестве прикрепленного изображения. С помощью этой справочной информации я могу открыть проект (из примера) Composition, чтобы найти все остальные ссылки, чтобы получить все имена ссылочных файлов.
Есть ли какая-либо утилита, которая выполняет эту работу автоматически? Я имею в виду, что при сборке .NET он рекурсивно проверяет все ссылки/зависимости, чтобы дать имена DLL.
Я проверил cygwin ldd и Depends.exe, но они, похоже, не показывают DLL из других проектов, а только для системных dll.
Да: ildasm.exe. Он устанавливается вместе с SDK.
Должно быть в пути, таком как: C:\Program Files (x86)\Microsoft SDK\Windows\v7.0A\Bin
Мне нравится использовать AsmSpy для этого типа проверки. Существует один exe для загрузки, а затем я помещаю его в папку с инструментами для удобного доступа. https://github.com/mikehadlow/AsmSpy
Вы можете использовать предоставленный файл ildasm.exe, или если вы хотите что-то более мощное, вы можете попробовать:
Еще лучше, попробуйте бесплатно:
Привет,
Я не знаю каких-либо инструментов для этого автоматически для вас, но я могу наметить шаги, которые должен будет выполнить любой инструмент (или вы).
Каждая сборка содержит манифест. В манифесте перечислены имена и версии всех других сборок, от которых зависит текущая сборка. В простейшем случае вам нужно будет следовать этому пути рекурсивно.
Нет правильного способа указать имена файлов ссылочных ассемблеров. Ссылки хранятся в манифесте как имена сборки (имя, версия, культура и т.д.), А не как имена файлов. Когда среда выполнения .NET должна загружать ссылочную сборку, она использует различные поисковые запросы, чтобы найти ее, и результат этих поисков может отличаться от среды к среде. Конечно, это может не быть проблемой для вас, если вы просто ищете сборки на своей машине разработки, например.
Методы разрешения ссылок на сборки включают в себя поиск уже загруженных сборок, просмотр в глобальном кэше сборок, поиск в каталоге приложения, перенаправление на основе файлов конфигурации приложений или политик издателя и других. Google для получения дополнительной информации см. Статью "Как Runtime Locates Assemblies" в MSDN. Кроме того, ваше приложение может зарегистрироваться для выполнения своего собственного эталонного разрешения, обработав событие System:: AppDomain:: AssemblyResolve.
Этот код выполнит довольно хорошую работу по поиску всех ссылок. "temp" будет дампом всех ссылок, которые он прослеживал.
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);
}
}
}