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