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

C# 有没有办法强制执行静态方法?,c#,dll,static,C#,Dll,Static,有没有办法在系统初始化时强制执行静态方法 我正在开发一个完全基于插件的系统。该项目的核心将包含系统的状态,并将触发一些事件,插件可以在这些事件中连接并创建新功能 我希望这个插件机制可以从插件透明地完成。所有插件必须做的就是实现系统核心的一个事件,并且应该正确地执行它。问题在于我需要在每个插件上执行一些代码来钩住系统核心事件。我首先想到的解决方案是在这些插件中声明一些方法,这些方法将在加载程序集或类似的东西时执行,但显然静态构造函数只在引用他的任何字段时执行;但在我的设计中,这是无法做到的:插件必

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

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

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

插件本质上是其他类或其他项目

有什么想法吗


谢谢。

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

更新,如评论中所述

关键是要有一个通用的、定义良好的插件结构,因此在任何给定点加载哪个插件都无关紧要,从核心的角度来看,它们都是相同的。它可以做一些类似的事情

PluginType instantiatedPlugin=methodThatInstantiates(pluginClass);
instantiatedPlugin.init();
然后,您可以循环浏览大量实例化和初始化所有插件的列表

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

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


如果所有插件都在同一个名称空间下,您可以轻松地完成这项工作。请参阅:

插件主机能否在启动时枚举所有加载的程序集,并查找实现您定义的初始化接口的类型?我会设计我的插件体系结构,以便每个插件都需要实现
Initialize()
方法。然后,当你的应用程序启动时,你只需遍历你找到的所有插件,并在每个插件上显式调用该方法。最好有一个明确的初始化过程由你来驱动,而不是把它留给你的插件(这可能会破坏过程中的一些东西)是的,尽管这不是最好的场景。如果插件可以只是在给定的程序集(dll)中实现的类,那就太棒了。在这个设计中,我试图实现,所有真正的业务规则都将在插件中实现,并且项目相对较大,所以如果我必须为每个插件创建1个程序集,那么在解决方案中我会有很多项目,我认为这是一件坏事。创建一个<代码> BasePuxin < /Cuff>类,并使所有插件都继承它。在这个方法中有一个执行共享逻辑的
Init
(或者在构造函数中执行)。然后在你的插件中,你可以使用
base.Init()
,或者在构造器hello@Arijoon中使用它!这样做我应该明确地调用这些Init方法,不是吗?这正是我想要避免的。我希望插件的初始化过程能够自动执行,而不需要显式地调用这些初始化方法。这是我实际使用的方法,但它需要很大的设计可伸缩性。理想的情况应该是自动初始化的插件成为系统核心。也许它不适合你,因为你是如何设计的。您可以为插件创建一个基类,然后从插件列表中大量加载它们。通过一个循环和两行代码,您加载了所有插件并调用了所有init()方法。这在插件和系统状态之间产生了我不想要的依赖关系。我理解,但我认为你不会找到其他东西。我不知道任何解决方案在内部也会这样做。最好尽可能轻松地构建自己的方法。第一次使用类时(使用属性或调用方法)调用静态构造函数。那是他们唯一的行为。大多数语言中甚至不存在静态构造函数。通过反射,如果所有插件都位于同一名称空间下,则可以轻松查询所有插件。多亏了你。