【问题标题】:Should I rely on dynamically loaded assemblies?我应该依赖动态加载的程序集吗?
【发布时间】:2014-07-08 07:01:22
【问题描述】:

我有以下情况。

  • 程序集 D 包含类 Data
  • Assembly F1 包含类,它创建、填充和返回Data
  • 程序集 F2 包含类,该类接受 Data 作为输入。

诀窍在于,所有这些程序集都是插件并且是动态加载的。当然 F1 和 F2 都引用了 D,但在运行时这三个都是由宿主应用程序加载的。

现在如果有人将 D 二进制文件替换为具有不同界面的较新版本会发生什么?

我编写了一个测试应用程序,它做了类似的事情,结果如下:

  • 在 Data 类中添加新字段不会导致异常;
  • 用另一个字段替换现有字段会导致 TargetInvocationException 带有信息,该请求的字段不存在

如果 .NET 跟踪接口调用,我很好。那是因为访问库的未更改部分将简单地工作,如果该部分发生更改,我会得到一个异常告诉我。所以它要么工作(在接口级别)要么不工作 - 没有未定义的行为。

我的问题:

  • 如何在运行时解析类型 - 特别是在程序集版本不匹配的情况下? .NET 是否跟踪字段/属性/参数/返回值类型和名称?
  • 有没有办法强制在某些特定版本中需要引用的程序集?

【问题讨论】:

  • 如何加载程序集? 'Just' 使用 Assembly.LoadFrom 或类似的东西?
  • @PatrickHofman 是的。我宁愿使用 Assembly.Load,但这不适用于不同文件夹中的程序集。程序集的动态加载是一团糟:(它比 DLL 地狱更糟糕...
  • 如何处理AssemblyResolve 事件?

标签: c# .net dynamic .net-assembly


【解决方案1】:

您的第二个问题:在 Visual Studio 中,有一种简单的方法可以强制您的应用程序使用引用程序集的特定版本。只需单击参考下的组件并查看属性。有一个属性称为“特定版本”。如果将其设置为 true 并在运行时加载另一个,则会出现异常。

您的第一个问题:我不确切知道 .Net 如何确定它何时能够使用程序集,它不是用编译的。因此,如果类/接口的签名发生更改,.Net 将抛出异常。 我认为 .Net 只是尝试使用新程序集,如果新程序集中的类/接口中的方法/属性具有修改的签名,则会引发异常。

【讨论】:

  • 这不适用于动态加载的程序集。它们不是通过项目引用添加的。
  • 这让我有点困惑。您想在运行时从插件文件夹加载一些程序集,因此它们在设计时是未知的。但是你想强迫他们有特定的版本?
  • 我认为问题更多是关于版本冲突解决。
  • @user27811 程序加载程序集 D 和 F1。 F1 要求 D 处于特定版本。
  • 在这种情况下,您可以强制 F1 使用特定版本引用 D。
猜你喜欢
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多