Компиляция Roslyn: тип определен в сборке, на которую нет ссылок

Я пытаюсь скомпилировать код с помощью Roslyn, но получаю следующее сообщение об ошибке:

CS0012: Тип «Func‹,>» определен в сборке, на которую нет ссылок. Вы должны добавить ссылку на сборку «System.Runtime, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a».

Меня все еще интересует сообщение, потому что Func<, > должно быть в mscorelib, а не в System.Runtime. Я искал эту ошибку и нашел только исправление, которое должно помочь, но не помогает.

У кого-нибудь были подобные проблемы с .net 4.5.1 и новейшей версией Roslyn?

Спасибо!


person BendEg    schedule 13.07.2015    source источник
comment
Почему вы думаете, что этого не должно быть в System.Runtime?   -  person DavidG    schedule 13.07.2015
comment
@DavidG, это была проблема. Смотрите мой ответ. Спасибо :)   -  person BendEg    schedule 13.07.2015


Ответы (3)


Ок, нашел решение. System.Runtime кажется проблемой (вначале я думал, что это не проблема с переносимыми библиотеками).

Мне нужно использовать следующий фрагмент кода:

 List<PortableExecutableReference> refs = new List<PortableExecutableReference>();
 refs.Add(MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "mscorlib.dll")));
 refs.Add(MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.dll")));
 refs.Add(MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.Core.dll")));
 refs.Add(MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.Runtime.dll")));
 refs.Add(MetadataReference.CreateFromFile(Assembly.GetEntryAssembly().Location));
person BendEg    schedule 13.07.2015
comment
Это правильный обходной путь на данный момент. Обратите внимание, что в зависимости от того, какие типы упоминаются в API-интерфейсах, которые вы используете из PCL, на который вы ссылаетесь, вам может потребоваться добавить больше фасадных ссылок, чем только одна. - person Kevin Pilch; 13.07.2015

Недавно у меня была аналогичная проблема. Я добавил следующую строку, и это решило проблему:

assemblyIdentityComparer: DesktopAssemblyIdentityComparer.Default

Вся инициализация объекта CSharpCompilation выглядит так:

var compilation = CSharpCompilation.Create(
    assemblyName,
    new[] { syntaxTree },
    references,
    new CSharpCompilationOptions(
        OutputKind.DynamicallyLinkedLibrary,
        optimizationLevel: OptimizationLevel.Release,
        assemblyIdentityComparer: DesktopAssemblyIdentityComparer.Default));
person Sergey Kolodiy    schedule 15.02.2016

Здесь есть пара связанных ошибок, одна в целях MSBuild и одна в Roslyn's MSBuildWorkspace. Все они должны быть исправлены, когда выйдет RTM-версия пакета инструментов MSBuild для VS2015 и версия 1.0 Roslyn.

Обычно MSBuild автоматически добавляет ссылки на System.Runtime, а остальные фасадные сборки ссылаются на переносимую библиотеку классов через цель «ImplicitlyExpandDesignTimeFacades», но это не работает для MSBuildWorkspace. (Примечание: по состоянию на 20.07.2015 это исправлено.)

Подробнее см. https://github.com/dotnet/roslyn/issues/2824. подробности.

person Kevin Pilch    schedule 13.07.2015
comment
Не бери в голову. Я только что понял, что вы создаете компиляцию вручную, поэтому вам следует добавить фасады самостоятельно. - person Kevin Pilch; 13.07.2015