Как мне сказать компилятору Roslyn C # использовать определенную версию .NET? - PullRequest
2 голосов
/ 24 сентября 2019

Я обнаружил, что двоичный файл csc.exe, который поставляется с Roslyn, может принимать аргумент командной строки -langversion:<string>, чтобы установить версию C #, которую я хотел бы скомпилировать.Но как мне выбрать, какую версию .NET я хотел бы использовать для компилятора?

Процесс компиляции прекрасно работает для моей простой тестовой программы, которая использует некоторые функции .NET SQL Server, поэтому я знаю, что компиляторкаким-то образом использует версию .NET на моем компьютере.В моем каталоге C:\Windows\Microsoft.NET\Framework есть несколько версий .NET, и я предполагаю, что компилятор использует одну из них.Я хотел бы явно указать, какую версию .NET компилятор использует при компиляции моей программы.

Примечание: если вы можете немного рассказать о том, как компилятор выбирает версию в первую очередь, это будеттакже высоко ценится.

Ответы [ 4 ]

1 голос
/ 24 сентября 2019

Я думаю, что это обрабатывается в свойствах проекта для Target Framework.

Щелкните правой кнопкой мыши проект в обозревателе решений, выберите свойства, выберите вкладку application.

enter image description here

1 голос
/ 24 сентября 2019

Предполагая довольно недавнюю сборку csc,

csc -langversion:?

скажет вам, какую версию языка эта сборка csc использует по умолчанию 1 .

Из комментария к другому ответу:

должен быть способ напрямую указать csc.exe, какую версию .NET я хочу использовать

Есть, и выВы уже определили его в первой строке вашего вопроса - передайте параметр -langversion.


Если вы хотите узнать, какую версию вы должны использовать, просто используйте значение по умолчанию,Если он не жалуется на ошибки синтаксис , это, вероятно, достаточно хорошо.Если вы используете определенные языковые функции, вы можете попробовать «Что нового в C # xx» , чтобы выяснить, в какой версии он был представлен.


1 Если выдает ошибку, она не поддерживает ее.Вместо этого запустите csc /?, и в документации для -langversion должны быть перечислены поддерживаемые версии.По умолчанию используется последний номер версии в списке.

1 голос
/ 24 сентября 2019

Я просто использую это из командной строки (то есть 2.0 ниже)

msbuild <project-or-solution> /p:TargetFrameworkVersion=v2.0
0 голосов
/ 24 сентября 2019

Короткий ответ: у вас неправильные отношения: 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

...