CSharpCodeProvider - как заюзать новые фичи языка (ответ)
От: Kolesiki  
Дата: 24.04.19 15:31
Оценка: -3
Ребят, наступил на грабли и сам поборол проблему, но думаю будет полезно всем.
Итак, есть неуклюжий .NET, созданный доблестными мелкокодерами, учащими нас модульности, принципам SOLID и т.п.;
Допустим, есть задача "на лету" скомпилять C# код, в котором используются новомодные фичи (напр., pattern matching). Простой и везде доступный код...

var csprovider = new CSharpCodeProvider();
var par = new CompilerParameters { GenerateInMemory = true, CompilerOptions = options };
par.ReferencedAssemblies.Add("Microsoft.CSharp.dll");
par.ReferencedAssemblies.Add("System.Core.dll");
var res = csprovider.CompileAssemblyFromSource(par, code);
return res.CompiledAssembly;


...работать не будет. Как не будет он работать и с очевидным параметром:

var csprovider = new CSharpCodeProvider(new Dictionary<string, string> {
    ["LangVersion"] = "8.0",
});


А грабля кроется в факте, что даже в нововышедшем FW 4.8 вы НЕ МОЖЕТЕ использовать свежий компилятор! Последняя доступная версия в этом FW — 5.0; Хотя казалось бы, а нафига его вообще выпускать, если он недоступен стандартными средствами! Даже мешочник с Павелецкого вокзала понимает, что FW, CSC и VS — это три разные вещи, проектировка которых просто обязана была предусматривать полную заменяемость и сочетаемость разных версий. Оставим этот траходром на совести тех, кто ещё долго будет нырять в этом болоте. Хак для работы (именно хак, а не очевидная опция) заключается в двух параметрах:

var csprovider = new CSharpCodeProvider(new Dictionary<string, string> {
    ["CompilerDirectoryPath"] = @"c:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Roslyn",
});
options += " -langversion:8.0 ";


И тогда, достатый из недр студии 2019, новый компилятор позволит вам все фичи.

PS
Я не понимаю, в чём вообще заключается связь между гемороем собеседований в этот распупыренный Мелкософт и теми лоботрясами, что проектируют в нём продукты?! Такую похабщину может проектировать вообще любой стажёр, зашедший в офис MS попить и случайно поступивший на работу. Дикость...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.