gpt4 book ai didi

.net - 引用两个相等的程序集,只有公钥不同

转载 作者:行者123 更新时间:2023-12-04 11:45:44 40 4
gpt4 key购买 nike

我的 Visual Studio 2008 项目引用了两个(外部)程序集 (A+B),这两个程序集恰好都引用了相同的第三个程序集 (C)。但是,程序集 A 期望程序集 C 具有与程序集 B 期望的不同的公钥。

下面是一个明显异常(exception)的例子:

Could not load file or assembly 'Newtonsoft.Json, Version=3.5.0.0, Culture=neutral, PublicKeyToken=9ad232b50c3e6444' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)



当然,我不能将两个版本的 C(仅通过公钥不同)放在同一个目录中,因为它们的文件名是相同的。其次,我发现使用配置文件中的程序集绑定(bind)只允许版本映射,而不是公钥映射。

我还尝试将其中一个程序集 C 放在单独的目录中,并将 CLR 配置为在加载程序集时在该目录中搜索。不幸的是,我无法让它发挥作用。

我知道重新编译一个外部库(其中一个恰好是开源的)可以解决这个问题,但如果不是绝对必要的话,我不想在我的维护计划中增加这个负担。

所以我的问题是:我将如何引用程序集 C 的两个“版本”,它们仅在公钥上有所不同?

更新

我偶然发现了 this answer到一个相关问题,使用 ilmerge 提供一个有趣的解决方案。我还没有检查过,但它可能对任何在这个问题上苦苦挣扎的人都有用。

最佳答案

我想知道 AssemblyResolve会工作:

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
if (args.Name == "full name with old key")
{
return typeof(SomeTypeInReferencedAssembly).Assembly;
}
return null;
}

他是我假设您已经引用了您的首选版本并且可以使用类型 SomeTypeInReferencedAssembly获取 Assembly ;你也可以使用:
return Assembly.Load("full name with new key");

我还没有尝试过,但在这里我基本上是在说“部署一个版本的 dll,当系统要求使用旧版本时 - 谎言”。

关于.net - 引用两个相等的程序集,只有公钥不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1744543/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com