【问题标题】:Upgrade a reference .Net dll with different publicKeyToken使用不同的 publicKeyToken 升级参考 .Net dll
【发布时间】:2012-11-13 21:13:22
【问题描述】:

我必须在我的项目中使用一些引用程序集 XXXXX 的 dll 文件。我现在在我的项目中有这个程序集的更新版本,但是当我运行我的项目时出现错误:Could not load file or assembly XXXXX, Version=XXXXX。我尝试使用MSDN article Redirecting Assembly Versions 解决此问题。但这无济于事。似乎重定向程序集不起作用,因为我有不同的公共令牌密钥。在旧程序集中是null。但它在较新的程序集中有一些价值“xxxxxxxxxxx”。如何解决这个问题?

附:类似的问题是here。但不同的是我有不同的公共令牌密钥。

【问题讨论】:

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


    【解决方案1】:

    您将需要获取您正在使用的针对新版本 XXXXXX 构建的 dll 文件的新版本。

    您可以在http://msdn.microsoft.com/en-us/library/yx7xezcf.aspx 中了解有关程序集查找的更多信息。

    【讨论】:

    • 此 dll 的新版本与新参考不可用
    • 那你就不走运了。您可以使用 blogs.msdn.com/b/thottams/archive/2007/02/01/… 中所述的 ildasm 和 ilasm 来构建自己的程序集版本,其中对 XXXXX 的过时引用引用了新版本。但这是一个相当低级的任务。我认为您需要重建的程序集没有签名,因为它引用了 XXXXXX 的未签名版本。
    • 你能同时拥有 XXXXX 程序集的两个版本吗,顺便说一句?
    • 不,我不能同时拥有两个版本...但是您之前对 ildasm 的评论对我有帮助。我使用 ildasm 从 dll 进行转储。然后我更改了 il 文件中的引用并使用 ilasm 编译它们。所以,我会把你的答案标记为正确的。
    【解决方案2】:

    共享 dll 中的公钥应保护应用免受“man/dll-in-the-middle”攻击。

    当当前 sub.dll 的公钥与编译 main.exe 时的公钥不同时,dot net 运行时正确拒绝使用 sub.dll 启动 main.exe。

    你可以解决这个问题

    • 用新的 sub.dll 重新编译 main.exe
    • 确保 sub.dll 的两个版本都使用相同的公钥编译。在您的情况下,您可以从 sub.dll 中删除公钥(即使用 ilmerge ),因为旧的 sub.dll 没有密钥。

    【讨论】:

    • 1) 我无法重新编译并避免在 dll 文件中使用 2 个不同的引用。有 2 个 3rd 方 dll 文件引用了某些 dll 的不同版本。 2)当我从 sub.dll 中删除公钥时,出现错误:“无法加载文件或程序集 'XXXXX' 或其依赖项之一。定位的程序集的清单定义与程序集引用不匹配。(来自 HRESULT 的异常:0x80131040) "
    猜你喜欢
    • 2012-10-18
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多