是否可以引用.NET dll指定多个强名称

时间:2016-10-21 14:51:19

标签: c# .net dll .net-assembly

我能否以某种方式指定我添加的引用具有强名称X或强名称Y?

我的.DLL引用了Microsoft.Exchange.WebServices.dll。不幸的是,它的nuget版本太旧了,没有一些错误修正。所以我从Github下载了它(它在那里更新)并构建它。所以我现在引用我自己的Microsoft.Exchange.WebServices.dll版本。这有效,但我的.DLL的一些用户可能需要使用原始的Microsoft.Exchange.WebServices.dll(例如,如果他们只能通过nuget安装libs),尽管nuget的版本没有有用的错误修正。

我想这样做,以便我的lib可以引用任何Microsoft.Exchange.WebServices.dll,具体取决于哪一个。所以引用必须允许来自Microsoft的强名称(来自nuget)和来自我的强名称。我可以以某种方式指定给定.dll允许的强名称列表吗?

1 个答案:

答案 0 :(得分:1)

  

我能否以某种方式指定我添加的引用具有强名称X或强名称Y?

,因为您还没有完全理解这个概念,请理解强名称密钥不仅仅是命名法,这是基于公钥 - 私钥组合的加密形式 ,使用私钥公钥签署二进制文件,以确保防篡改。您无法执行此操作,因为对于Microsoft.Exchange.WebServices.dll您需要使用Microsoft的加密证书,实际上是访问其私钥,这是不可能的。

  

你的主要问题,虽然你可以从Github编译Microsoft.Exchange.WebServices.dll的代码,但是你的客户可能仍然会得到一个Nuget版本而且它们不会一起工作。特别是因为它的版本相同,一个是签名的,另一个是未签名的

您的选项是将Microsoft.Exchange.WebServices.dll重命名为自定义名称,在编译二进制文件时使用自定义命名空间,然后虽然您的代码将使用Microsoft代码作为自定义二进制文件,但客户仍然可以获得Nuget版本和它们不会发生任何冲突,即使它们直接使用API​​或从GAC加载它。

回答OP的评论

评论1:

如果您要从MS库中公开类型,这意味着您将创建一个包装器,那么无论如何,使用您的库和Nuget库的客户将很难处理类似的API,除非它们捆绑在一起用于清晰划分的唯一命名空间。事实上,请注意,即使签名,这也行不通,因为在给定的时间点,只有一个具有给定名称和版本的程序集可以加载到App域中,签名负责防篡改。如果你也改变版本可以工作,但在运行时可能会导致非常奇怪和意想不到的问题

评论2:

感谢您进一步澄清,您只想使用公钥 - 私钥组合签署MS库:

  • 如上所述,由于名称和版本相同,仍然无法加载
  • 选项是重命名或至少更改版本

您要编写的内容将进行编译,但在运行时可能会导致意外的二进制解析问题。由于你有来自Github的代码,最好是带有自定义名称的镜像,以获得100%预期的行为。