是否可以将 Assembly.ReflectionOnlyLoad 与发布者策略/程序集版本控制一起使用?

Lad*_*nka 7 .net c# versioning assemblies loading

我的目标:

我们允许将我们的产品与由于许可而未作为我们产品的一部分安装的第三方组件(库)集成。目前我们只想加载与第三方组件相关的功能,前提是这些组件安装在客户端的机器上。

当前解决方案:

我正在使用Assembly.ReflectionOnlyLoad提供第三方程序集的全名来在应用程序加载相关功能之前验证第三方组件的安装。这适用于以下场景:

  • 库的确切版本安装到 GAC
  • 库的确切版本被复制到应用程序目录/探测路径

问题:

现在我需要修改解决方案以支持发布者策略(将程序集绑定重定向到新版本)。我刚刚测试了我的代码,它似乎ReflectionOnlyLoad忽略了部署到 GAC 的发布者策略,因此即使正确安装了第三方程序集(具有程序集重定向的新版本),我的机制也不会加载预期的功能。

如果我删除我的验证(= 每次都会加载功能),应用程序将正确加载新版本的第三方程序集,因此发布者策略可以正常工作,因为功能仍然依赖于旧版本进行编译。

使用版本控制和程序集重定向时,如何验证 GAC 和探测路径中程序集的存在?

小智 5

您似乎可以调用AppDomain.ApplyPolicy将策略应用于程序集名称。然后,您可以调用ReflectionOnlyLoad()返回的名称。


cod*_*zen 2

你不能只使用ReflectionOnlyLoad.

和朋友的全部目的ReflectionOnlyLoad是能够检查程序集元数据,而不考虑策略和版本控制。

张俊峰在他的检查方法中解释了这ReflectionOnlyLoad一点

我怀疑如果您想对加载应用策略,则需要在单独的 AppDomain 中加载程序集并在那里对它们进行推理。这种方法的好处是您将能够卸载AppDomain用于反射和验证的内容。缺点是它带来了很大的复杂性。然而,我没有看到太多的选择。

一旦你有了一个单独的AppDomain,你将需要一些MarshalByRefObject类来允许你从你的主类进行远程验证AppDomain。该类可以加载到远程AppDomain并执行任何Assembly.Load调用,并跟踪结果。完成后,您将某种报告返回给 main 中的调用者AppDomain。最后,您可以卸载遥控器AppDomain。您在那里加载的类型不会在 main 中加载AppDomain