有没有办法强制执行静态方法?

时间:2016-04-23 18:34:06

标签: c# dll static

有没有办法强制在系统初始化中执行静态方法?

我正在开发一个基于插件的系统。该项目的核心将包含系统的状态,并将触发一些插件可以连接并创建新功能的事件。

我希望这个插件机制能够从插件中透明地完成。所有插件必须执行的是实现系统核心的事件,并且应该正确执行。问题是,我需要在每个插件上执行一些代码来挂钩系统核心事件。我首先想到的解决方案是在这些插件中声明一些方法,这些方法将在加载程序集时执行,或类似的东西,但显然静态构造函数只有在对其任何字段进行引用时才会执行;但在我的设计中,它无法完成:插件必须对系统核心保持不可见。

插件基本上是其他类或其他项目。

有什么想法吗?

感谢。

1 个答案:

答案 0 :(得分:1)

我认为最简单的方法是为此方法定义一个通用名称(如init()),并在加载每个库后调用它。

更新,如评论中所述

关键是要有一个通用的,定义明确的插件结构,所以你在任何给定点加载哪一个并不重要,从核心的角度看它们都是一样的。它可以做类似的事情

PluginType instantiatedPlugin=methodThatInstantiates(pluginClass);
instantiatedPlugin.init();

然后你可以循环遍历一个插件列表,大量实例化并初始化所有插件。

如果每个插件都是一个单独的DLL,则列表可以是插件目录中的所有* .dll文件(添加一些安全性验证)。

或者您可以使用Reflection来获取所有插件的类。如果类在同一个二进制文件中,或者在加载所有DLL之后,这是有效的。

如果所有插件都在同一名称空间下,您可以轻松完成。请参阅:Getting all types in a namespace via reflection