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

时间:2015-07-13 09:08:38

标签: c# .net compilation roslyn mscorlib

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

  

CS0012:类型' Func<,>'在未引用的程序集中定义。您必须添加对程序集的引用,System.Runtime,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'。

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

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

谢谢!

3 个答案:

答案 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