Ответ 1
Прежде всего, существует важное различие между ссылочными сборками и сборками в GAC. Чтобы скомпилировать код, вам нужна эталонная сборка. Для запуска кода вам нужна либо копия сборки в той же папке, что и ваш .exe, либо сборка в GAC.
Обычно, когда вы устанавливаете приложение .NET, его установщик будет копировать сборки, которые он использует в GAC. Эти сборки не могут использоваться в качестве эталонных сборок, вы не можете узнать, в какой папке она хранится, поэтому вы не можете сообщить компилятору правильное значение аргумента командной строки/ссылки. Ну, вы можете узнать, но Microsoft попыталась сделать это как можно труднее с помощью надстройки оболочки.
Что-то другое происходит при установке .NET-приложения, которое позволяет использовать его сборки в вашей собственной программе. Как и .NET framework. Он будет делать две копии каждой сборки. Один идет в GAC, другой идет в "хорошо известном" месте. Для платформы .NET эти хорошо известные местоположения - это c:\windows\microsoft.net\и c:\program files\reference assemblysies. Последняя папка начала использоваться .NET 3.0 и выше.
В диалоговом окне "Добавление ссылки на Visual Studio" используется раздел реестра, в котором перечислены эти известные местоположения. Есть пара, но важна HKLM\Software\Microsoft\.NETFramework\AssemblyFolders
.
Короче говоря: вы можете использовать этот раздел реестра для создания того же списка, который создает диалог Add Reference. Но он не на 100% надежный, вы можете пропустить ссылки, которые некоторые продукты копировали где-то в другом месте. Вам нужно будет использовать вкладку "Обзор" в VS, чтобы добавить ссылки на них. И найдите весь диск, чтобы найти их самостоятельно.