【问题标题】:Strong name required for assemblies referenced from unsigned project?从未签名项目引用的程序集需要强名称?
【发布时间】:2013-07-20 15:18:22
【问题描述】:

我正在开发WCF 服务。 WCF 服务接口和实现位于不同的项目中。还有一个 Windows 服务项目来托管 WCF 服务。

WCF 服务实现需要做的一件事是调用多个外部 (SOAP) Web 服务。我们通常构造它的方式是为 SOAP 服务创建一个单独的类库项目;我们将在类库中创建一个 Web 引用和一个工厂/辅助方法。

上述细节可能与实际问题相关,也可能不相关。这是我在构建 WCF 服务实现项目(其中 X 是 SOAP 服务包装程序集之一)时遇到错误:

引用的程序集“X”没有强名称

但 WCF 服务实现项目未设置为签名(接口项目也未设置)。在这一点上,唯一引用它的两件事是 Windows 服务项目和一个单元测试项目——而且两者都没有签名。

WCF 实现还引用了其他(预先存在的)Web 服务包装器项目,但它只是抱怨这两个项目。我在文本编辑器中并排提取了一个现有项目文件和一个新项目文件......而且我可以看到任何显着差异。

我还检查了是否有任何项目正在导入需要对其进行签名的设置,如 Stack Overflow 问题 Remove signing from an assembly 中所述。好像不是这样的。

我试图在我的 WCF 实现中使用 AutoMapper——1.1,因为我们仍在使用 .NET 3.5。那是一个签名的程序集,所以我可以看到它可能在我的代码和 SOAP 服务包装器上存在问题。但在我看来,这将是一个运行时问题,而不是构建时间。但是因为我怀疑它可能至少是一个促成因素,所以我删除了 AutoMapper 和依赖代码,但我仍然得到同样的错误。

我已经研究过这个问题,大部分搜索结果都包含有关如何签署(可能是第三方)程序集的说明。

我已尝试删除并重新添加引用,重新启动 Visual Studio 和我的电脑。

Visual Studio 2010 / .NET 3.5 在 Windows 7 64 位上。

我确定我遗漏了一些相当明显的东西......我就是不知道是什么。

【问题讨论】:

  • 您需要发布运行 Fuslogvw.exe 失败绑定的跟踪信息。
  • 你能澄清一下它什么时候抱怨这两个网络服务没有被强签名吗?编译 WCF 时?或者在编译网络服务时?或者正在拨打电话时?
  • @Basic - 编译 WCF 服务实现项目(它引用 SOAP Web 服务包装器)时。
  • @Hans = 感谢您的回复,我不知道 fuslogvw。但是我的是构建时而不是运行时问题。
  • 这增加了找到错误程序集的几率。你仍然使用 Fuslogvw。你真的需要跑腿才能得到答案,我们远程调试是行不通的。

标签: c# .net visual-studio-2010 strongname


【解决方案1】:

嗯……这很尴尬。

正如我所怀疑的,这很简单。服务接口和实现实际上是要签名的;我是不正确的。然而,这是在项目设置/文件中完成的,不是,而是在AssemblyInfo.cs 文件中,通过指令 [assembly: AssemblyKeyFile("keyfile.snk")].

我不熟悉这种签名方法。我认为它自 VS2005 以来已被弃用 - 部分原因是通过项目属性管理签名更直接,部分原因是将此信息放入 AssemblyInfo 被认为存在安全风险。

事实上,我至少查看了AssemblyInfo 文件中的一个……但显然我没有向下滚动足够远。 (我说这很尴尬。)

希望其他人可以从中受益。

【讨论】:

    【解决方案2】:

    您不能从已签名的程序集中引用未签名的程序集,无法构建的项目应该是具有与其相关联的强名称密钥的项目。

    您可能在全局程序集缓存中拥有 MSBuild 获取的引用之一的签名版本,而不是您选择的引用。

    【讨论】:

      猜你喜欢
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多