Roslyn 编译:类型在未引用的程序集中定义

Roslyn compilation: type is defined in an assembly that is not referenced

我尝试使用 Roslyn 编译一些代码,但收到以下错误消息:

CS0012: The type 'Func<,>' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.

我仍然对消息感到疑惑,因为 Func<, > 应该在 mscorelib 而不是 System.Runtime 中。我搜索了这个错误,只找到了一个应该有帮助但没有帮助的热修复程序。

是否有人对 .net 4.5.1 和最新的 Roslyn 版本有类似的问题?

谢谢!

好的,找到解决办法了。 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));

这里有几个相关的错误,一个在 MSBuild 目标中,一个在 Roslyn 的 MSBuildWorkspace 中。当 VS2015 包的 MSBuild 工具的 RTM 版本和 Roslyn 的 1.0 版本发布时,它们应该都得到修复。

通常 MSBuild 会自动添加对 System.Runtime 的引用,并且您的其余外观程序集通过 "ImplicitlyExpandDesignTimeFacades" 目标引用可移植的 class 库,但这对于 MSBuildWorkspace 是错误的. (注意:截至 2015 年 7 月 20 日,此问题现已修复。)

有关更多详细信息,请参阅 https://github.com/dotnet/roslyn/issues/2824

我最近遇到了类似的问题。我添加了以下行并解决了问题:

assemblyIdentityComparer: DesktopAssemblyIdentityComparer.Default

整个 CSharpCompilation 对象初始化如下所示:

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