【发布时间】: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