允许人们修改程序

本文关键字:程序 修改 许人们 | 更新日期: 2023-09-27 18:34:52

假设某个程序员递给我一个编译的程序,没有源代码,它做了一些事情,但没有图形表示它的作用。但是,它确实提供了轻松添加它的能力。但是程序员将如何让人们与编译程序中的事物进行交互呢?

这个演示程序只是创建一个随机数,有一个最大值,然后触发一个事件,该事件应该暴露那些想要在自己的程序模组中使用此数据的人发生了什么。

public delegate void MadeRandomEventHandler(int previous,int current,int max);
class MakeRandom
{
    private static int current = 350;
    private static int max = 350;
    public static event MadeRandomEventHandler MadeRandomEvent;
    public static void dowork()
    {
        int curCopy = current;
        Random random = new Random();
        current = random.Next(0, max+1);
        fireMadeRandomEvent(curCopy,current,max);
    }
    private static void fireMadeRandomEvent(int previous, int current, int max)
    {
        if (MadeRandomEvent != null)
            MadeRandomEvent(previous,current,max);
    }
}

当然还有一个带有按钮的表单,用于调用dowork((

public partial class Form_Main : Form
{
    public Form_Main()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        MakeRandom.dowork();
    }
}

所以现在我所要做的就是创建一个向我展示发生了什么的模组,创建一个带有进度条的新表单并处理 MakeRandom 类触发的事件。

形式:

public partial class Form_Mod : Form
{
    public static Form_Mod frm;
    public Form_Mod()
    {
        InitializeComponent();
    }
    private void Form_Mod_Load(object sender, EventArgs e)
    {
        frm = this;
        progressBar1.Minimum = 0;
        progressBar1.Maximum = 100;
    }
    public void updateProgress(int percent)
    {
        progressBar1.Value = percent;
    }
}

以及事件处理:

class Mod_HandleEvents
{
    public static void attach()
    {
        MakeRandom.MadeRandomEvent += new MadeRandomEventHandler(RandomChange);
    }
    public static void detach()
    {
        MakeRandom.MadeRandomEvent -= new MadeRandomEventHandler(RandomChange);
    }
    private static void RandomChange(int previous, int current, int max)
    {
        float percent1 = (float)current / (float)max;
        int percent = (int)(percent1 * 100);
        Form_Mod frm = Form_Mod.frm;
        frm.updateProgress(percent);
    }
}

但是我如何将此代码添加到提供给我的程序中?我没有源代码,所以我无法添加它然后重新编译。我见过几个程序似乎可以即时编译.cs文件,而这些.cs文件似乎与主程序相互作用。我该怎么做?

我可能必须向主窗体添加另一个按钮才能真正打开我的"Form_Mod"窗体。所以交给我主程序的程序员必须提供一种方法来做到这一点,对吧?还是有别的办法?

private void button2_Click(object sender, EventArgs e)
{
    Form_Mod frm = new Form_Mod();
    Mod_HandleEvents.attach();
    frm.Show();
}

允许人们修改程序

您可以创建一个插件。实现一个接口(所有插件通用(,描述插件预期提供的所有方法和功能。然后你可以动态加载插件(在运行时(,如下所示: Assembly.LoadFrom("plugin.dll") - 请参阅 http://msdn.microsoft.com/en-us/library/1009fa28.aspx

更详细地描述此方法的文章:http://www.codeproject.com/Articles/4691/Plugin-Architecture-using-C

另一个:http://www.c-sharpcorner.com/UploadFile/rmcochran/plug_in_architecture09092007111353AM/plug_in_architecture.aspx

此外,

我会将插件加载到新的应用程序域中,以防止它做任何恶意的事情,但这有点高级...... 请参阅编写 C# 插件系统

执行此操作的最佳方法是将编译的代码作为引用导入到您自己的项目中。 即像类库一样使用它,就像所有标准 .NET 引用一样。 然后,您可以在自己的应用程序中使用其类,而无需担心该外部库后面的源代码。

为此,请在项目下有一个"引用"文件夹,右键单击此文件夹,添加引用,然后浏览到已编译的.dll或.exe。 添加后,可以在代码中使用 MakeRandom 类(请记住包含相应的using或使用其命名空间限定名称(。

查看此链接。您引用的内容通常也称为插件。它基本上是一个类 Libary(dll(,它从你的一个 DLL 实现一个接口,它定义了你期望插件的外观。现在,您只需扫描文件夹中的其他DLL并使用反射来查找实现插件接口的类,当您拥有该类并加载程序集时,您可以创建该类型的实例并使用它。