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

本文关键字:程序 程序集 集中 定义 引用 编译 类型 Roslyn | 更新日期: 2023-09-27 18:02:33

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

CS0012:类型'Func<,>'在未被引用的程序集中定义。必须添加对程序集"System"的引用。运行时,版本=4.0.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a'.

我,仍然想知道的消息,因为Func<, >应该在mscorelib,而不是在System.Runtime。我已经搜索了这个bug,只找到了一个应该有帮助的热修复,但没有。

有没有人在。net 4.5.1和最新的Roslyn版本中遇到类似的问题?

谢谢!

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));

我最近也遇到过类似的问题。我添加了下面一行,它解决了问题:

assemblyIdentityComparer: DesktopAssemblyIdentityComparer.Default

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

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

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

通常MSBuild会自动添加引用到System。运行时和facade程序集的其余部分通过"ImplicitlyExpandDesignTimeFacades"目标引用可移植类库,但这在MSBuildWorkspace中被打破了。(注意:自2015年7月20日起,此问题已修复。)