【问题标题】:Use .net DLL with broken References使用带有损坏参考的 .net DLL
【发布时间】:2018-01-23 08:36:01
【问题描述】:

我必须在我的应用程序(C#、.NET 4.5)中使用 DLL 作为 API。我可以正常引用DLL。完全没有错误。但是如果我想使用这个 DLL 的任何类,我会得到以下编译错误:

错误 CS1705 程序集“Assembly_X”,标识为“Assembly_X”, 版本=12.3.0.0,文化=中性,PublicKeyToken=c878e80841e75d00' 使用'Assembly_YY,版本=65535.65535.65535.65535,文化=中性, PublicKeyToken=c878e80841e75d00' 版本高于 以标识“Assembly_YY”引用程序集“Assembly_YY”, 版本=12.3.0.0,文化=中性,PublicKeyToken=c878e80841e75d00'

然后我检查了 ILSpy 中的 DLL (Assembly_X)。 Assembly_X 有两个对 Assembly_YY 的引用:一个是 12.3.0.0 版本,一个是 65535.65535.65535.65535 版本。

我尝试了 App.config 中的“bindingRedirect”。但由于错误发生在编译时,这无济于事。

我没有 Assembly_X 或 Assembly_YY 的源代码。

如何使用或修复此 DLL?


更新

dll 的开发者终于响应了我的求助。他们知道的唯一解决方法是使用 Visual Studio 2013 而不是 Visual Studio 2015 或 2017。似乎 VS 2013 根本不受这些双重引用的困扰。

他们写道,错误是由 dll 的加密工具造成的。 谢谢大家的想法和帮助。

【问题讨论】:

  • 你能用实际值更新 X 和 Y 吗?这将使我们能够为您提供帮助。
  • 这些是来自另一家公司的 DLL,我无法发布 DLL 的名称。你不会知道这些 DLL,因为世界上只有少数人在使用它们。
  • 由于 PBK 相同,您可以尝试通过 using ilmerge 伪造您的 Assembly_YY 版本。在尝试此操作之前,请确保您有 Assembly_YY 的备份/副本。如果这不起作用,您可以try it the hard way
  • 第 3 方 DLL 编译的 .NET Framework 版本是什么?使用assemblyinformation.codeplex.com 或 Telerik JustDecompile 快速检查。它可能与 .net 4.5 不兼容
  • 好主意。但它是相同的框架版本。 ILSpy 也给了我这个信息 [assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]

标签: c# .net dll


【解决方案1】:

您引用的 DLL 版本比您当前拥有的更高版本。 您需要添加对更高版本程序集的引用:

'Assembly_YY, Version=65535.65535.65535.65535, Culture=neutral, PublicKeyToken=c878e80841e75d00' 

为了解决这个问题。

现在你正在引用

 'Assembly_X' with identity 'Assembly_X, Version=12.3.0.0, Culture=neutral, PublicKeyToken=c878e80841e75d0

如果这是一个可下载的库,请在 nuget 包管理器中搜索并下载它。 如果是你自己写的库,请获取最新版本的库并添加到你的项目中。

【讨论】:

    【解决方案2】:

    看起来第一个 DLL 引用的库版本比您正在使用的其他 DLL 版本高。

    因此您需要考虑 3 个 DLL:A、B 和 Bv2

    您的项目正在引用 A 和 B 但是 A 引用了 Bv2(B 的更新版本) 所以当你去使用 A 的函数时,它会抛出一个错误,因为它找到的是 B 而不是 Bv2。

    【讨论】:

    • 我没有 Bv2。我认为它从未存在过,因为版本号很奇怪。
    • 是的,这有点奇怪。也许他们在对 B 进行了一些修改后重新编译了 A,并制作了 Bv2。但这是一个奇怪的参考。它是 16 位整数的限制。我会联系创建 DLL 的人并让他们检查该版本。
    【解决方案3】:

    问题基本上是您引用的“Assembly_X”引用了程序集“Assembly_YY”版本 12.3.0.0 和 65535.65535.65535.65535,而您在应用程序中仅引用了“Assembly_YY”版本 12.3.0.0 并且没有引用 65535.65535.65535.65535

    现在根据Microsoft Docs 上的问题说明,以及您没有所需程序集的源代码的示例:

    将 DLL 的“Assembly_YY”版本 65535.65535.65535.65535 的引用添加到您的应用程序以使其编译并使应用程序能够运行,您可以提供包含使用 @987654323 的 <dependentAssembly> 元素的应用程序配置文件@ 和 <codeBase> 子元素指定 DLL 版本 12.3.0.0 的位置。

    【讨论】:

    • 感谢您的想法。我没有这个 Assembly_YY 版本 65535.65535.65535.65535。我认为它不存在(该产品的所有其他组件都有“有意义的”版本)。我可以以某种方式复制 Assembly_YY 并将版本更改为 65535.65535.65535.65535?
    • @Marius 如果库不是很大,您可以获取源代码(RedGate .net Reflector、Telerik JustDecompile)并尝试重新编译它,只要值得努力
    • 这是值得的。我会试试这个。 (呃,以前从来没有做过这样的事情,这将是最有趣的)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 2014-06-25
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    相关资源
    最近更新 更多