Я пишу приложение, которое использует Roslyn API для извлечения информации о символах, определенных в C# файлах исходного кода. Это делается путем компиляции исходного кода в памяти и последующего сканирования. Чтобы это работало, мне нужно загрузить сборки и пакеты nuget, на которые ссылается исходный код.
Это работало хорошо ... пока я не начал анализировать некоторый исходный код, содержащий несколько простых выражений Linq, таких как:
return Channels.Aggregate( retVal, ( current, channel ) => current | channel.Channel );
Детали того, что делает этот код, не важны. Но наличие этой строки в исходном коде привело к следующей ошибке диагностики c, когда база кода была скомпилирована в памяти:
CS1061 - «Список» не содержит определения «Агрегат» и не имеет может быть найден доступный метод расширения «Агрегат», принимающий первый аргумент типа «Список» (отсутствует директива using или ссылка на сборку?)
Channels
- это List<>
. Очевидно, что мне не хватает ссылки:).
Что меня смущает, так это наличие определенных сборок и пакетов по умолчанию, которые я загружаю для всех проектов:
okay &= TryAddMetadataReference( "netstandard", result );
okay &= TryAddMetadataReference( "System.Private.CoreLib", result );
okay &= TryAddMetadataReference( "System.Private.Uri", result );
okay &= TryAddMetadataReference( "System.Runtime.Extensions", result );
Опять детали того, что этот код Я думаю, что это не так важно. Все эти вызовы завершаются успешно, это означает, что все целевые сборки найдены и загружены в среду компиляции.
Тем не менее, выражение Linq отклоняется, поскольку код Linq не может быть найден.
Нужно ли добавить еще одну сборку Linq-speci c?