'PgpPublicKey' 类型存在于 'BouncyCastle.Crypto, Version=1.9.0.0...' 和第三方 dll 中

The type 'PgpPublicKey' exists in both 'BouncyCastle.Crypto, Version=1.9.0.0...' and thirdparty dll

今天我需要在我的网络应用程序中做一些 Open PGP encryption/decryption,所以我使用 nuget 将 BouncyCastle 添加到我的解决方案中,并从 Whosebug (SOF) 添加一些示例代码来测试加密文件。

并出现错误:

Error CS0433 The type 'PgpPublicKey' exists in both 'BouncyCastle.Crypto, Version=1.9.0.0, Culture=neutral, PublicKeyToken=0e99375e54769942' and 'iTextV***, Version=5.6.140.0, Culture=neutral, PublicKeyToken=null'

那么如何解决这个问题?

在SOF中搜索后,我找到了一些解决方案,但目前无法解决:

  1. 将所有 dll 更改为 BouncyCastle.Crypto 的 reference the same version 1.9.0.0。但不幸的是,我们使用了同一公司的2个第三方dll iTextV***.dll和itext.v***.dll,但我们没有代码让他们更改引用和重建dll。

  2. One post in SOF 讲述了汇编“别名”,但我们使用 Web 应用程序并且没有像那样的项目引用 dll 来更改别名。我尝试在 web.config 中添加这个,但也没有用:

<dependentAssembly>
  <assemblyIdentity name="BouncyCastle.Crypto" publicKeyToken="0e99375e54769942" culture="neutral"/>
  <bindingRedirect newVersion="1.9.0.0"/>

</ dependentAssembly>

之后

经过极端思考或无论我们怎么称呼,我找到了一些可能的解决方案(不是最好的,但可以接受 IMO(在我看来)),以防您无法通过互联网上找到的其他解决方案修复它:

  1. 在我自己的调用 B 上创建另一个 c# 应用程序项目,引用 BouncyCastle 库,这样就不会发生冲突。然后编写我想要的函数,然后将项目 B 构建到 dll 并将 B dll 添加到 A -我的主要项目/网络应用程序作为一个独立的第三方库。所以A只调用B中的函数,不需要调用BouncyCastle,不再有版本冲突。

  2. 由于BouncyCastle是开源项目,我们可以去their site,下载代码然后手动添加(复制/粘贴)必要的类Cs到我们的主项目/web应用A,这样所有的Cs就变成了类我们的项目。我们使用 Cs 而不是 using Org.BouncyCastle.*。不再有版本冲突。 P/S 归功于 BouncyCastle 团队。