Как компилятор Roslyn C # узнает, где найти файлы сборки .NET? - PullRequest
0 голосов
/ 26 сентября 2019

Я скачал копию Roslyn с помощью nuget.exe в пустой каталог на моем компьютере.Затем я создал несколько небольших тестовых файлов в C # для воспроизведения с компилятором.В моем коде я использую функции .NET Framework, такие как SqlDataReader.При компиляции с помощью бинарного файла csc.exe, включенного в Roslyn, я не указываю вручную какие-либо сборки .NET, которые будут включены в параметры командной строки -reference или -r, но все по-прежнему работает.

У меня естьобнаружил файл csc.rsp в том же каталоге, что и csc.exe, включая некоторые из этих сборок .NET.Параметры командной строки в этом файле добавляются автоматически, если параметр командной строки -noconfig не указан.Часть файла выглядит следующим образом:

# Reference the common Framework libraries
/r:Accessibility.dll
/r:Microsoft.CSharp.dll
/r:System.Configuration.dll
/r:System.Configuration.Install.dll
/r:System.Core.dll
/r:System.Data.dll
/r:System.Data.DataSetExtensions.dll
/r:System.Data.Linq.dll
/r:System.Data.OracleClient.dll
/r:System.Deployment.dll

Я подозреваю, что этот файл csc.rsp является причиной, по которой компилятор может успешно скомпилировать мой код, даже если я не включил никакие сборки .NET вручную.Мой вопрос, однако, как csc.exe даже знает, где искать эти файлы?

Я искал весь каталог Roslyn с VSCode для любой возможной конфигурации, определяющей, какие пути искать сборки, но у меня ничего не выскакивало,Я также проверил переменную системного пути для каталога, из которого он может автоматически получать файлы, но там я тоже ничего не нашел.Как csc.exe включает эти файлы, хотя я не сказал ему, где их искать на моем компьютере?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Эти сборки находятся в глобальном кэше сборок .

0 голосов
/ 26 сентября 2019

Как csc.exe включает эти файлы, хотя я не сказал ему, где их искать на моем компьютере?

Он запускает код, который ищет файлы, гдеэто ожидает их.Расположение по умолчанию кода платформы .NET определяется компилятором.Если вы хотите узнать точные детали, прочитайте исходный код компилятора.

Класс, на который вы хотите посмотреть, это все, что происходит от MetadataReferenceResolver.См.

https://github.com/dotnet/roslyn/search?q=MetadataReferenceResolver

. Для компилятора командной строки вам необходимо обратиться к LoggingMetadataFileReferenceResolver, который делегирует большую часть своей работы RelativePathResolver.

...