【问题标题】:Best practise when loading foreign assemblies加载外部程序集时的最佳实践
【发布时间】:2014-07-16 07:54:17
【问题描述】:

我正在寻找有关如何最好地将外部程序集视为分发和加载的一部分的指导。

基本情况是,我一直在开发一个旨在与另一个已安装程序交互的程序。 另一个程序具有开放的.Net API,旨在与我自己的第三方应用程序交互,但它会定期更新。 这些更改并不总是破坏性更改,但这通常会迫使我更新自己的应用程序并为公众发布一个版本。

我考虑的三个主要概念是:

  1. 使用我自己的应用程序打包仅包含 API 的外部程序集。 考虑的缺点是:增加发行版大小。强制检查已安装的外部应用程序的二进制文件和 API 二进制文件的本地副本,并尝试更新它们以保持同步。

  2. 直接从外部安装文件夹中的外部程序集加载它们。 考虑的缺点是:如果外部应用决定更新二进制文件,则锁定它们。

  3. 将外部程序集复制到一个临时文件夹,然后从那里加载它们。 考虑的缺点是:复制数十个文件(包括资源程序集)以及可能将它们留在临时文件夹中所花费的时间。

是否有最佳实践或其他公认的方法?

编辑:我应该指出我的应用程序使用 WPF。

【问题讨论】:

  • 我刚刚仔细查看了 AppDomainSetup.ShadowCopyDirectories,但我不确定这是否适合来自不同位置的 两组 组程序集。本地引用的程序集和外部程序集都需要由应用程序加载。 AppDomainSetup 似乎只适用于一组。我必须手动加载本地引用的程序集,以免引发 File Not Found Exception。
  • 您是否考虑过使用MEF resp。 PRISM?它是为与您的情况完全相同的任务而创建的。引用自 MSDN:Why We Built It Several years ago, within Microsoft, a number of groups were working to find solutions to a problem—how to build applications from reusable components that can be discovered, reused and composed dynamically.

标签: c# .net assemblies


【解决方案1】:

我在使用第三方应用程序时遵循的一些一般概念:

  • 在第三方 API 和您的代码之间放置一个Adapter Layer,以提供您的对象和第三方对象之间的接口。将在您的适配器层中更改重大更改以使其兼容。
  • 在测试中为外部服务使用存根,以便您可以切换第三方调用

您可以考虑遵循我参加的Dan North Accelerated Agile 课程中提到的“边防”方法的想法。在此策略中,您可以在第三方 API 进行重大更改之前与他们配对。为系统编写一套单元测试来描述您对它们的使用,然后第三方将它们集成到他们自己的系统单元测试中。然后,您将通过 API 更新通知您系统的任何重大更改,然后再将它们推送到上游!如果这是您可以与第三方合作完成的事情,则可以节省一些未来的痛苦。

【讨论】:

    猜你喜欢
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多