我尝试使用Roslyn编译一些代码,但收到以下错误消息:
CS0012:类型' Func<,>'在未引用的程序集中定义。您必须添加对程序集的引用,System.Runtime,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'。
我仍然对这条消息感到疑惑,因为Func<, >
应该在mscorelib中而不在System.Runtime
中。我已经搜索过这个错误,只找到了一个应该有用的热修复,但没有。
是否有人与.net 4.5.1和最新的Roslyn版本有类似的问题?
谢谢!
答案 0 :(得分:5)
好的,找到了解决方案。 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));
答案 1 :(得分:2)
我最近遇到过类似的问题。我添加了以下行,它解决了问题:
assemblyIdentityComparer: DesktopAssemblyIdentityComparer.Default
整个CSharpCompilation
对象初始化如下所示:
var compilation = CSharpCompilation.Create(
assemblyName,
new[] { syntaxTree },
references,
new CSharpCompilationOptions(
OutputKind.DynamicallyLinkedLibrary,
optimizationLevel: OptimizationLevel.Release,
assemblyIdentityComparer: DesktopAssemblyIdentityComparer.Default));
答案 2 :(得分:1)
这里有一些相关的错误,一个在MSBuild目标中,一个在Roslyn的MSBuildWorkspace中。当用于VS2015软件包的MSBuild工具的RTM版本和Roslyn的1.0版本出来时,它们都应该被修复。
通常,MSBuild将自动添加对System.Runtime的引用,并且您的其余外观程序集通过“ImplicitlyExpandDesignTimeFacades”目标引用可移植类库,但这对于MSBuildWorkspace而言已被破坏。 (注意:截至2015年7月20日,现已修复。)
有关详细信息,请参阅https://github.com/dotnet/roslyn/issues/2824。