某些背景...
我有一个.net程序集(.net framework 4.6,fwiw),可以在主机应用程序中作为插件运行。主机应用程序提供了插件用来执行其业务的API,并且还提供了一个包含参考程序集的SDK,插件项目在构建时会使用该参考程序来编译插件。
在运行时,预期宿主应用程序可能会比构建插件时提前许多版本,并且一切都很好,只要它通过其SDK公开的API不变即可。 (所做的重大更改将生成SDK / API的新版本,并且主机仅支持以当前API版本运行的插件)
现在,我想创建一个测试,以验证主机应用程序的当前内部版本未更改API,并在检测到重大更改时相应地失败(在这种情况下,我们将决定是否修订API版本) ,或还原该特定更改,等等……)
我的问题是,尽管在加载时可能会检测到一些API更改(这很棒,但是我的测试无法加载该插件,并且我已经完成了),但很多都没有。具体来说,在插件程序中的各种类方法中对宿主API的引用都无法解析,直到实际执行了插件方法为止。
例如,假设我的插件有一个方法PluginMethod,该方法调用宿主应用程序中HostClass提供的某些宿主方法HostMethodA,并且在宿主应用程序的当前版本中,方法HostMethodA的名称更改为HostMethodB。
在这种情况下,我能够成功加载插件程序集,但是除非我创建包含插件类的实例并实际执行PluginMethod,否则无法检测到对HostMethodA的引用在运行时将失败。
我已经尝试了所有可以想到的事情,以使加载的插件程序集中的引用得以完全解决,但是由于实际上并未执行该方法,因此没有什么可以让我到达那里。
似乎在Assembly(或Type或MethodInfo)上应该有一些方法可以迫使运行时尝试尝试解析程序集(或Type或Method)中所有方法中的所有引用。执行程序集中的每个代码路径。但是我找不到这种机制。
或者,如果我可以得到一个MemberInfo类型的项目列表就足够了,这些项目代表插件程序集中方法的外部引用(程序集名称,class ::方法,参数的数量和类型都可以)对照我当前的主机应用程序版本进行验证。真的也找不到一种很好的方法。
感谢您阅读本文,我非常感谢您提出的任何建议。
罗杰