gpt4 book ai didi

c# - 在运行时交换强签名程序集

转载 作者:行者123 更新时间:2023-11-30 18:01:48 26 4
gpt4 key购买 nike

我有一个引用第 3 方库的项目。库的制造商会定期发布新版本。我的最终目标是能够在运行时选择在执行期间必须使用哪个版本。

目前,我正在尝试在运行时加载版本号高于编译期间所用版本号的程序集。我编译我的项目,用更新版本替换第 3 方库并尝试运行该应用程序。这是我遇到的问题。我收到一条错误消息:

“找到的程序集的 list 定义与程序集引用不匹配”

看到这个错误我并不感到惊讶,因为程序集是强签名的。我寻找绕过这个的方法,但到目前为止没有任何运气。

我认为绑定(bind)重定向可以帮助我,但它的缺点是您不能指定“新版本”的范围。任何组合都应该有效,旧版本与新版本,反之亦然。

 <bindingRedirect oldVersion="1.2.7.0" newVersion="1.2.8.0" /> 

http://msdn.microsoft.com/en-us/library/eftw1fys.aspx

我也研究过动态调用,但后来我失去了类型安全性(我的代码广泛使用了第 3 方程序集中定义的类型)。 --> 删除引用很困难。

删除项目定义引用中的公钥也无济于事。编译期间使用的任何其他程序集版本都会失败。

<Reference Include="<assemblyname>">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\Dependencies\<manufacturer>\1.2.7.0\<assemblyname>.dll</HintPath>
</Reference>

注意:在运行时加载和卸载程序集的逻辑已经存在。没有可用于第 3 方库的接口(interface)

最佳答案

您可以通过处理 AssemblyResolve 来“解决”这个问题(变通可能是一个更好的描述) AppDomain 上的事件。处理此事件使您的代码有机会在查找程序集的所有常规方法都无法找到匹配版本时提供需要加载的程序集。

在事件处理程序中,您需要检查 ResolveEventArgs.Name 属性以查看程序集是否是您需要加载的程序集。 Name 属性将是正在加载的程序集的长名称 - 即“Widget.Net, Version=1.2.3.4, Culture=neutral, PublicKeyToken=xxxxxxxxxxx”。

一旦识别出正确的加载请求,只需加载程序集的正确版本(Assembly.LoadFrom、Assembly.Load、Assembly.LoadWithPartialName)并从事件处理程序返回它。请注意,Assembly.LoadWithPartialName 已标记为已过时,但如果目标程序集在 GAC 中,这似乎是处理此问题的唯一方法。

// application initialization
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
if (args.Name.StartsWith("Widget.Net, Version="))
{
Assembly result = Assembly.LoadFrom("Widget.Net.dll");
return result;
}
return null;
}

请务必注意,虽然这“解决”了问题,但从任何意义上讲都不是好的解决方案。它完全颠覆了.Net框架使用的程序集的普通版本和强名称检查。当您别无选择时,这是您要做的事情,因为(如问题所示)供应商搞砸了他们的程序集版本。您还依赖于它们不会对引用版本和加载版本之间的程序集中定义的类进行重大更改 - 即您使用的所有类、属性、方法等仍然存在并具有相同的签名。

为了至少维持一种伪装的安全性,至少检查 AssemblyResolve 事件处理程序是一个非常好的主意:

  1. 加载的程序集版本比请求的版本新
  2. 加载和请求的程序集的公钥 token 匹配

关于c# - 在运行时交换强签名程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8702064/

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