Вы должны быть в состоянии сделать это с помощью простого PowerShell:
1) загрузить Visual Studio своим решением
2) скомпилировать все решение
3) оставить VSзапустить и запустить powershell.exe
4) получить ссылку на все еще работающий экземпляр DTE VS из ROT (важно - убедитесь, что запущен только один экземпляр - если он повышен, powershell тоже должен быть):
ps> $dte = [System.Runtime.InteropServices.Marshal]::GetActiveObject("visualstudio.dte")
5) Проверка путем перечисления всех проектов в решении с их ссылками:
ps> $dte.solution.projects | select @{l="name";e={$_.name}}, `
@{l="references";e={$_.object.references|select -exp name}} | ft -auto
... выводит все имена и ссылки проектов ...
6) Теперь, напишите какой-нибудь скрипт для обхода папки решения и проектов
7) когда вы нажмете на папку bin \, загрузите сборку только с отражением нагрузки:
$assembly = [reflection.assembly]::reflectiononlyload($dll)
8) получите фактические ссылочные сборки в выходной сборке
$refs = $assembly.getreferencedassemblies()
9) сравнивают фактические ссылочные сборки со сборками, на которые есть ссылки в проекте, и удаляют избыточные сборки через VS DTEобъектная модель
# example
$currentproj.object.references.item("system.core").remove()
$currentproj.save()
10) прибыль!
Это работает, потому что .net связывает только те сборки, на которые действительно есть ссылки в коде.Извините, я не могу опубликовать полный рабочий пример, но этого должно быть достаточно, чтобы вы начали.
-Oisin