C# 是否有充分的理由选择反思而不是参考?

C# 是否有充分的理由选择反思而不是参考?,c#,.net,reflection,reference,.net-assembly,C#,.net,Reflection,Reference,.net Assembly,在查看一些遗留代码时,我遇到了一段代码,该代码使用反射来加载一些dll,这些dll的源代码是可用的(它们是解决方案中的另一个项目) 我绞尽脑汁想弄明白为什么会这样做(当然代码没有文档化…) 我的问题是,您是否可以考虑通过反射而不是引用程序集来加载程序集的好理由?是的,如果您有一个动态模块系统,其中应根据运行时的条件加载不同的DLL。我们在我工作的地方这样做;我们对可能加载到系统中的不同可选模块执行许可证检查,然后仅在许可证已签出时加载与每个模块关联的DLL。这可以防止永远不应该执行的代码被加载,

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

我绞尽脑汁想弄明白为什么会这样做(当然代码没有文档化…)


我的问题是,您是否可以考虑通过反射而不是引用程序集来加载程序集的好理由?

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

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

现在,您通常希望将其用于此类任务,但这只是在.NET4.0之后出现的,因此可能有许多代码库可以手动执行。(我对MEF不太了解。也许你也需要在那里手动完成这部分。)


但无论如何,您的问题的答案是,使用反射动态加载DLL肯定有很好的理由。如果没有更多细节,就无法确定它是否适用于您的案例。

如果不知道您的具体项目,这里没有人能告诉您为什么在您的案例中采用这种方式

但一般原因是:

  • 可更新性:您可以简单地重新编译和替换更新的库,而不必重新编译和替换整个应用程序

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

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

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

我希望这能帮助您了解一些设置

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

让我们考虑一个场景,其中有三个类,方法是“代码> DOWORK())/>代码>该方法返回“代码>字符串,通过检查条件(强类型)来访问它。

现在,在两个不同的DLL中又有两个类,您将如何应对这些更改

1) 您可以添加新DLL的
引用
,更改条件检查并使其工作


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

插件体系结构,如MEF?@omribitan,我认为这几乎不是松耦合。这可能会欺骗IDE,使其相信程序集是松耦合的,但在加载程序集时,您仍然需要知道它包含什么内容(例如,方法名)。@AviTurner不一定,它实际上取决于实现。。您可以加载dll并迭代其类型以查找实现特定接口的类型,例如。。。任何一个想法……当你的第一个和最后一个点都有意义的时候,你不能用引用和接口实现<代码>合作<代码>和<代码>可重用性< /代码>吗?@ aviurn:DLL的优点是,你可以导入用C++等其他语言编写的库。这需要一些努力,但这是可能的。