CodeAnalysis: загрузка сборки Linq - PullRequest
0 голосов
/ 28 марта 2020

Я пишу приложение, которое использует 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?

1 Ответ

1 голос
/ 28 марта 2020

Согласно. NET Основные источники (Aggregate метод, AssemblyInfo.cs и System.Linq.csproj файлы), все методы определены в System.Linq сборка (но в. NET Framework они находятся в System.Core сборка).

Итак, попробуйте добавить и загрузить System.Linq сборку

...