是否有理由更喜欢反思而不是参考?

时间:2013-09-17 07:03:17

标签: c# .net reflection reference .net-assembly

查看一些遗留代码,我遇到了一段代码,这些代码使用反射来加载一些dll,他们的源代码是可用的(它们是解决方案中的另一个项目)。

我正在破解我的头骨试图弄清楚为什么这样做(当然代码没有记录......)。

我的问题是,您是否可以考虑选择通过反射加载装配而不是引用装配的任何理由?

3 个答案:

答案 0 :(得分:1)

是的,如果你有一个动态模块系统,应根据运行时的条件加载不同的DLL。我在工作的地方这样做;我们对可能加载到我们系统中的不同可选模块进行许可检查,然后仅在许可证签出时加载与每个模块关联的DLL。这样可以防止永远不会被执行的代码被加载,这既可以略微提高性能又可以防止错误。

动态加载DLL还可以让您在不更改任何源代码的情况下彻底更改功能。例如,主程序集可以启动一个发现过程,在该过程中它找到实现某个接口的所有类,并根据某些运行时标准选择使用哪个类。

现在,您通常希望使用MEF来执行此类任务,但这仅限于.NET 4.0以来,因此可能有许多代码库可以手动执行。 (我对MEF知之甚少。也许你必须在那里手动完成这部分。)

但无论如何,你的问题的答案是,使用反射动态加载DLL肯定有充分的理由。如果没有更多细节,是否适用于您的情况是不可能的。

答案 1 :(得分:1)

在不知道具体项目的情况下,没有人可以告诉你为什么在你的情况下这样做了。

但一般原因是:

  • 可更新性:您只需重新编译并替换更新的库,而不必重新编译和替换整个应用程序。

  • 合作:如果界面清晰,那么多个团队可以一起工作。一个用于主要应用程序,另一个用于dll

  • 可重用性:有时您需要在多个项目中使用相同的功能,因此可以反复使用相同的dll

  • 可扩展性:在某些情况下,您希望以后能够使用在发货时不存在的插件扩展您的程序。这可以使用dll来实现。

我希望这有助于您了解一些设置..

答案 2 :(得分:0)

Reason for loading an assembly via reflection rather than referencing it?

让我们考虑一个场景,其中有三个类,方法为DoWork(),此方法返回string,您通过检查条件(强类型)来访问它。

现在你在两个不同的DLL中还有两个类,你将如何应对这一变化?

1)您可以添加reference个新DLL,更改条件检查并使其正常工作。

2)您可以使用reflection,在运行时传递条件和程序集名称,这允许您在runttime添加任意数量的功能,而不会在主要应用程序中更改代码。