【问题标题】:Roslyn compilation: type is defined in an assembly that is not referencedRoslyn 编译:类型在未引用的程序集中定义
【发布时间】:2015-07-13 09:08:37
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

  • 是什么让您认为它不应该出现在 System.Runtime 中?
  • @DavidG 这是问题所在。看我的回答。谢谢你:)

标签: c# .net compilation roslyn mscorlib


【解决方案1】:

好的,找到了解决方案。 System.Runtime 似乎是问题所在(一开始我认为这不是可移植库的问题)。

我需要使用下面的代码sn-p:

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

【讨论】:

  • 这是目前正确的解决方法。请注意,根据您在引用的 PCL 中使用的 API 中提到的类型,您可能需要添加更多的外观 refs 而不仅仅是那个。
【解决方案2】:

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

assemblyIdentityComparer: DesktopAssemblyIdentityComparer.Default

整个CSharpCompilation对象初始化如下:

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

【讨论】:

    【解决方案3】:

    这里有几个相关的错误,一个在 MSBuild 目标中,一个在 Roslyn 的 MSBuildWorkspace 中。当 VS2015 软件包的 MSBuild 工具的 RTM 版本和 Roslyn 的 1.0 版本出来时,它们都应该得到修复。

    通常,MSBuild 将自动添加对 System.Runtime 的引用,并且您的其余外观程序集通过“ImplicitlyExpandDesignTimeFacades”目标引用可移植类库,但这对于 MSBuildWorkspace 来说已被破坏。 (注意:截至 2015 年 7 月 20 日,此问题现已修复。)

    有关更多详细信息,请参阅https://github.com/dotnet/roslyn/issues/2824

    【讨论】:

    • 没关系。我刚刚意识到您正在手动构建 Compilation,因此您应该自己添加 Facades。
    猜你喜欢
    • 2015-03-29
    • 2014-09-17
    • 2016-05-26
    • 2017-01-08
    • 2011-08-16
    • 2014-08-15
    • 2016-05-01
    • 2018-01-10
    • 1970-01-01
    相关资源
    最近更新 更多