Roslyn编译:类型在未引用的程序集中定义
本文关键字:程序 程序集 集中 定义 引用 编译 类型 Roslyn | 更新日期: 2023-09-27 18:02:33
我试着用Roslyn编译一些代码,但得到以下错误消息:
CS0012:类型'Func<,>'在未被引用的程序集中定义。必须添加对程序集"System"的引用。运行时,版本=4.0.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a'.
我,仍然想知道的消息,因为Func<, >
应该在mscorelib,而不是在System.Runtime
。我已经搜索了这个bug,只找到了一个应该有帮助的热修复,但没有。
谢谢!
好的,找到解决方案了。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日起,此问题已修复。)