【发布时间】:2015-12-08 02:40:52
【问题描述】:
我正在为我工作的公司在 VS2015 中开发一个小项目,作为公司政策,我们生产的所有程序集都必须签名。
当我将依赖项添加到包含未签名程序集的 nuget 包时,我发现了一些奇怪的行为。使用vs2015 构建项目时,我收到警告:
CSC:警告 CS8002:引用的程序集 'XXX,Version=A.B.C.D,Culture=neutral,PublicKeyToken=null' 没有强名称。
当我第一次看到它时,这似乎很奇怪,因为我记得它没有在 VS2013 或更早版本中编译。其实我在vs2013构建同一个项目的时候会报如下错误:
CSC:错误 CS1577:程序集生成失败 -- 引用的程序集“XXX”没有强名称。
我认为运行时可能发生了一些变化,现在已经支持。我大错特错了。在 VS2015 中运行带有警告的代码时,现在出现运行时错误。我得到的确切例外是带有消息的FileLoadException
无法加载文件或程序集“XXX,Version=A.B.C.D,Culture=neutral,PublicKeyToken=null”或其依赖项之一。需要强命名程序集。 (HRESULT 异常:0x80131044)
我知道有一些 nuget 包会在构建之前签署任何未签名的依赖项(例如 this one、this other 或 this last one)。
我的问题是:有什么方法可以从已签名的程序集引用未签名的程序集,而我错过了什么?如果不是,那为什么现在是编译器警告,如果稍后会给出运行时错误?
提前致谢
【问题讨论】:
-
似乎有一个 GitHub 问题为此开放:github.com/dotnet/roslyn/issues/399 看起来该问题已关闭,但修复已使其成为 1.0 RC2,您是否使用较旧的 RC 工作?
-
我使用的是 VS2015 的 RTM 版本。我认为您指出的问题与我遇到的问题不一样。您指出的似乎是 roslyn 错误地报告了对未签名程序集的引用,而实际上引用的程序集已签名。
-
我在回答中遗漏了一个非常重要的细节,使其几乎毫无用处:您自己项目中的引用实际上记录了程序集未签名的事实。我的回答是关于对已签名程序集的项目引用,但针对未签名程序集进行构建,这是一种不同的情况。我把我的答案删了,很好奇有没有人能给你一个好的答案。
-
我们正在github.com/dotnet/roslyn/issues/7277跟踪这个问题