Короткий ответ: у вас неправильные отношения: csc.exe
зависит от Рослина, а не наоборот.
Длинный ответ требует короткого урока истории:
Изначально в .NET Framework, csc.exe
был автономным двоичным файлом, отвечающим за компиляцию исходного кода C # в IL.Но он был непрозрачным, и его интерфейс командной строки ограничивал то, чего можно было достичь, вызывая его.
Microsoft представила пространство имен и классы System.CodeDom
как способ для своих собственных инструментов генерировать код (например, конструктор Windows Forms).в Visual Studio), но почти все начали использовать его, потому что он был намного лучше, чем csc.exe
.Однако, учитывая то, для чего он был создан, CodeDOM страдает от многочисленных ограничений и крайних случаев, которые делают его менее чем идеальным для определенных задач, не связанных с компиляцией, - и в конце концов он просто вызывает csc.exe
для создания скомпилированного кода.
В конечном итоге этот подход не смог удовлетворить собственную потребность Microsoft в более качественном статическом анализе кода в их флагманской IDE.Чтобы выполнить это требование, потребовался новый API, и Microsoft поняла, что если они разработают его так, чтобы он был доступен обычным разработчикам, они могли убить двух зайцев одним выстрелом.Так родился проект Roslyn: полный набор независимых и законченных API-интерфейсов, которые мог бы использовать любой, тем самым удовлетворяя потребности как разработчиков, так и Visual Studio.
Конечным результатом является то, что вся логика, которая существовалаcsc.exe
мигрировал в API-интерфейсы Roslyn и способ вызова этих API определяет, какая версия языка C # будет использоваться.Передача -langversion
в csc.exe
или /p:TargetFrameworkVersion
в msbuild.exe
в конечном итоге приводит к настройке версии на языке Roslyn для компиляции, но ничто не мешает вам создать собственный экземпляр компиляции Roslyn для достижения того же.
Ссылка: https://stackoverflow.com/a/7854697/70345