【问题标题】:Why does roslyn give warning CS8002 instead of error CS1577 for unsigned references?为什么 roslyn 对未签名的引用给出警告 CS8002 而不是错误 CS1577?
【发布时间】:2015-12-08 02:40:52
【问题描述】:

我正在为我工​​作的公司在 VS2015 中开发一个小项目,作为公司政策,我们生产的所有程序集都必须签名。

当我将依赖项添加到包含未签名程序集的 nuget 包时,我发现了一些奇怪的行为。使用 构建项目时,我收到警告:

CSC:警告 CS8002:引用的程序集 'XXX,Version=A.B.C.D,Culture=neutral,PublicKeyToken=null' 没有强名称。

当我第一次看到它时,这似乎很奇怪,因为我记得它没有在 VS2013 或更早版本中编译。其实我在构建同一个项目的时候会报如下错误:

CSC:错误 CS1577:程序集生成失败 -- 引用的程序集“XXX”没有强名称。

我认为运行时可能发生了一些变化,现在已经支持。我大错特错了。在 VS2015 中运行带有警告的代码时,现在出现运行时错误。我得到的确切例外是带有消息的FileLoadException

无法加载文件或程序集“XXX,Version=A.B.C.D,Culture=neutral,PublicKeyToken=null”或其依赖项之一。需要强命名程序集。 (HRESULT 异常:0x80131044)

我知道有一些 nuget 包会在构建之前签署任何未签名的依赖项(例如 this onethis otherthis last one)。

我的问题是:有什么方法可以从已签名的程序集引用未签名的程序集,而我错过了什么?如果不是,那为什么现在是编译器警告,如果稍后会给出运行时错误?

提前致谢

【问题讨论】:

  • 似乎有一个 GitHub 问题为此开放:github.com/dotnet/roslyn/issues/399 看起来该问题已关闭,但修复已使其成为 1.0 RC2,您是否使用较旧的 RC 工作?
  • 我使用的是 VS2015 的 RTM 版本。我认为您指出的问题与我遇到的问题不一样。您指出的似乎是 roslyn 错误地报告了对未签名程序集的引用,而实际上引用的程序集已签名。
  • 我在回答中遗漏了一个非常重要的细节,使其几乎毫无用处:您自己项目中的引用实际上记录了程序集未签名的事实。我的回答是关于对已签名程序集的项目引用,但针对未签名程序集进行构建,这是一种不同的情况。我把我的答案删了,很好奇有没有人能给你一个好的答案。
  • 我们正在github.com/dotnet/roslyn/issues/7277跟踪这个问题

标签: vs2015 vs2013 c# roslyn


【解决方案1】:

在某些平台(如 CoreCLR)上,从已签名引用未签名程序集是可以的。编译器不知道您将在哪个平台上运行,因此它不再报告错误。我们仍然会报告警告,因为您可能会像在 Desktop CLR 上一样遇到问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 2015-08-04
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多