我应该依赖动态加载的程序集吗?

本文关键字:程序集 加载 依赖 动态 我应该 | 更新日期: 2023-09-27 18:04:14

我有以下情况

  • 组件D包含Data类。
  • Assembly F1包含一个类,它创建、填充和返回Data
  • 汇编F2包含类,它接受Data作为输入。

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

现在,如果有人用新版本的二进制文件替换D,会发生什么?

我编写了一个测试应用程序,它做了类似的事情,结果如下:
  • 在Data类中添加新字段不会导致异常;
  • 用另一个字段替换现有字段会导致TargetInvocationException中包含请求字段不存在的信息

如果。net跟踪接口调用,我很好。这是因为访问库中未更改的部分将正常工作,如果该部分发生更改,我将得到一个异常,只是告诉我。因此,它要么工作(在接口级别),要么不工作-没有未定义行为。

我的问题:

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

我应该依赖动态加载的程序集吗?

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

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