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

时间:2014-05-20 06:41:50

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

我有以下情况。

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

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

现在如果有人用新版本替换D二进制文件会有什么变化,这个版本有不同的界面?

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

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

如果.NET跟踪接口调用,我很好。那是因为访问库中未更改的部分只会起作用,如果该部分发生变化,我只会告诉我一个例外。所以它将工作(在接口级别上)或不工作 - 没有未定义的行为。

我的问题:

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

1 个答案:

答案 0 :(得分:0)

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

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