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提供了一个有趣的解决方案.我还没有检查过它,但对于遇到这个问题的人来说这可能是有用的.
我想知道是否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,当系统要求旧版本时 - 撒谎”。
| 归档时间: |
|
| 查看次数: |
9182 次 |
| 最近记录: |