Как работает Microsoft.Bcl.Async?

Microsoft.Bcl.Async позволяет разработчикам использовать async/await ключевые слова без .NET Framework 4.5, для которых они предназначены для их использования.

Это здорово, благодаря невероятно тяжелой работе людей в CLR и языковых командах Microsoft.

Теперь мне любопытно, как это может работать.

async/await требует от компилятора сделать тяжелый подъем, чтобы превратить код в то, что может ожидать ожидание операций.

Компилятор изначально генерирует ошибки компиляции в .NET Framework 4.0, даже если он четко знает, что означает async/await (Visual Studio 2012/2013.)

Итак, как эта библиотека сообщает компилятору не бросать определенные ошибки компиляции, связанные с асинхронными операциями, и делать некоторый код, как и в .NET Framework 4.5?

Ответ 1

async/await - не что иное, как трансформация компилятора С# 5.0. Нет уровня async/await на уровне IL.

Одним простым примером может быть оператор using() { }, который также является преобразованием компилятора. Он просто преобразует оператор using в блок try/finally. Тем не менее, существует зависимость от существования интерфейса IDisposable, который определен в .NET 1.1.

Аналогично, преобразование async/await зависит от определенных типов, таких как интерфейс IAsyncStateMachine, которые определены в .NET 4.5. Microsoft.Bcl.Async получает эти определения типов для .NET 4.0.

ИЗМЕНИТЬ

Как сборка Microsoft.Bcl.Async заставляет компилятор распознавать новое ключевое слово (async/wait)?

Нет, нет. Компилятор С# 5.0 уже знает о ключевых словах и что с ними делать. Однако он не может найти требуемые типы, поскольку проект предназначен для .NET 4.0. Пакет Microsoft.Bcl.Async содержит эти типы.

Ответ 2

MS2012 устанавливает .net 4.5, поэтому вы не можете "компилировать ошибки с 4.0", как вы описали