Почему бы просто не вызвать msbuild для вашего проекта или файла решения, передать ему расширение / v: d и проанализировать выходной файл для получения необходимой информации? Например, вы увидите что-то вроде следующего для каждого разрешения сборки:
Primary reference "System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089".
Resolved file path is "c:\WINNT\Microsoft.NET\Framework\v2.0.50727\System.Data.dll".
Reference found at search path location "{TargetFrameworkDirectory}".
For SearchPath "{TargetFrameworkDirectory}".
Considered "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.exe", but it didn't exist.
Considered "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.dll", but it didn't exist.
Considered "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.Data.exe", but it didn't exist.
Considered "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.Data.dll", but it didn't exist.
Considered "c:\WINNT\Microsoft.NET\Framework\v3.5\System.Data.exe", but it didn't exist.
Considered "c:\WINNT\Microsoft.NET\Framework\v3.5\System.Data.dll", but it didn't exist.
Considered "c:\WINNT\Microsoft.NET\Framework\v3.0\System.Data.exe", but it didn't exist.
Considered "c:\WINNT\Microsoft.NET\Framework\v3.0\System.Data.dll", but it didn't exist.
Considered "c:\WINNT\Microsoft.NET\Framework\v2.0.50727\System.Data.exe", but it didn't exist.
This reference is not "CopyLocal" because it's a prerequisite file.
В качестве альтернативы MSBuild делегирует задачу разрешения сборок классу Microsoft.Build.Tasks.ResolveAssemblyReference из сборки Microsoft.Build.Tasks.v3.5 (в моем случае, сборка на основе платформы 3.5). Вы можете проанализировать файл проекта и предоставить экземпляр ResolveAssemblyReference с соответствующими (мета) данными, и позволить ему выполнить разрешение за вас - кажется идеальным, поскольку именно это и делает MSBuild.