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

San*_*zen 7 .net assemblies reference visual-studio

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

这是一个明显例外的例子:

无法加载文件或程序集'Newtonsoft.Json,Version = 3.5.0.0,Culture = neutral,PublicKeyToken = 9ad232b50c3e6444'或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)

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

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

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

所以我的问题是:如何引用程序集C的两个"版本",它们只有公钥不同?

UPDATE

我偶然发现了一个相关问题的答案,使用ilmerge提供了一个有趣的解决方案.我还没有检查过它,但对于遇到这个问题的人来说这可能是有用的.

Mar*_*ell 5

我想知道是否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;
}
Run Code Online (Sandbox Code Playgroud)

他是我假设您已经引用了您的首选版本并且可以使用该类型SomeTypeInReferencedAssembly来获取Assembly; 你还可以使用:

return Assembly.Load("full name with new key");
Run Code Online (Sandbox Code Playgroud)

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


Ada*_*son 5

你永远不应该有两个版本相同公钥不同的程序集,这是灾难的秘诀。如果实际程序集版本不同,那么绝对最简单的解决方案是将它们放在全局程序集缓存(GAC) 中。但是,如果您将处理在 C 中定义并在 A 和 B 中使用的类型的实例(例如, C 声明MyType,并且您MyType从 B获取 的实例并将其传递给 A . 就运行时而言,这两种类型除了共享一个名称外,完全没有任何关系)。

如果您正在寻找临时解决方案,那么我会选择 Marc 的;听起来它应该可以完美运行。话虽如此,但是,您要走这条路的事实应该是一个巨大的危险信号。