Критические изменения C# — под одеялом

Наши рабочие машины и машины для разработки работают под управлением .Net 4.5, но наши серверы сборки — .Net 4.0. Мы нацелены на .Net 4.0, и я пытаюсь оценить влияние сборки на машину с 4.0. В prod во время выполнения я знаю, что он будет использовать сборки 4.5, но...

Я прочитал документ от MS о критических изменениях в VS 2012, но я пытаюсь понять, как это работает под прикрытием. Я могу воспроизвести проблему для примера лямбда. Когда я запускаю приложение на сервере 4.0 и 4.5, оно ведет себя одинаково. Я бы подумал, что среда выполнения исправит проблему в 4.5. http://msdn.microsoft.com/en-us/library/vstudio/hh678682(v=vs.110).aspx.

Я также читал о проблемах совместимости с 4.5: http://msdn.microsoft.com/en-us/library/hh367887%28v=vs.110%29.aspx

Я полагаю, что во время компиляции он использует ссылки из C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0, а во время времени выполнения использует C :\Windows\Microsoft.NET\Framework\v4.0.30319.

Мой вопрос заключается в том, как VS ведет себя по-разному в 2010 и 2012 годах. Это связано с тем, что он использует другой MSBuild.exe или другой CSC.exe? Я запускаю это через монитор процессов, но это не ясно, потому что он показывает MSBuild в программных файлах, но я не могу его найти.


person jagberg    schedule 28.08.2014    source источник


Ответы (1)


Я могу воспроизвести проблему для примера лямбда. Когда я запускаю приложение на сервере 4.0 и 4.5, оно ведет себя одинаково.

Если вы имеете в виду изменение поведения в C#, когда речь идет о захвате переменной итерации в цикле foreach, это вообще не вопрос фреймворка. Это разница компилятора. Если вы используете компилятор C# 5, вы получите новое поведение, а если вы используете компилятор C# 4, вы получите старое поведение. Вы можете ориентироваться на .NET 2.0 и выполняться на машине, на которой установлена ​​только .NET 2.0, и вы все равно получите новое поведение, если будете компилировать с помощью компилятора C# 5.

Теперь, если на ваших серверах сборки установлена ​​только .NET 4.0, они будут использовать компилятор C# 4. В принципе, ваши варианты:

  • Используйте старый обходной путь копирования переменной итерации в переменную, объявленную внутри цикла.
  • Установите .NET 4.5 на свои серверы сборки, чтобы получить поведение C# 5.

Однако это очень специфично для данной конкретной проблемы. Другие проблемы совместимости, вероятно, будут иметь другие требования.

person Jon Skeet    schedule 28.08.2014