Список всех доступных сборок .NET

Каков наилучший способ перечислить все доступные сборки .NET 2.0?

Примером необходимого списка является тот, который MS Visual Studio показывает, когда вы делаете "Добавить ссылку..." на вкладке .NET.

Я читал, что Visual Studio использует собственную конфигурацию своего каталога, а другой GAC - другую и .NET. Любые идеи о том, как я могу знать, где эти каталоги находятся на переносном компьютере (на другом компьютере могут быть установлены окна, например, на диске D:)

Из приведенной информации должна быть доступна Assembly.Loadxxxx().

Примечание. Это нужно делать программно и не использовать gacutil, например (если он не предоставляет API С#). Цель всего этого - создать пользовательский динамический редактор script, чтобы вы поняли необходимость доступа к этой информации.

Ответ 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, чтобы добавить ссылки на них. И найдите весь диск, чтобы найти их самостоятельно.

Ответ 2

Единственная информация, которую я нашел ранее по той же проблеме, - this, но я никогда не использовал эту информацию.

По внешнему виду, это выглядит немного громоздким, чтобы пересечь каталог, чтобы найти все .DLL файлы, но, возможно, это то, что вам нужно сделать.