c# - 允许人们修改程序

标签 c#

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

这个演示程序简单地生成一个随机数,有最大值,然后触发一个事件,该事件应该公开那些想要在他们自己的程序 mod 中使用这些数据的人所发生的事情。

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();
    }
}

所以现在我需要做的就是创建一个显示发生了什么的 mod,创建一个带有进度条的新表单并处理 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();
}

最佳答案

您可以创建一个插件。实现一个接口(interface)(对所有插件通用),描述插件预期提供的所有方法和功能。然后您可以像这样动态地(在运行时)加载插件: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# - 允许人们修改程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10665161/

相关文章:

c# - 为什么用匿名委托(delegate)声明此事件?

C#:预期某种类型时抛出的异常

c# - 在 C# 中使用游标进行字符计数

c# - 在C#中查询另一个列表中的列表

c# - 如何将 BOOLEAN 传递给 Oracle 12c 程序?

c# - WP Silverlight 8.1 App - 触摸时提醒不启动应用程序

c# - 将 LINQ to Entities 分成多个部分

c# - 更改 .net 部署的应用程序的 Properties.settings

c# - visual studio 网站 - 有很多随机错误,但仍在 build 中?

c# - .Net Framework 4.5 AddObject() 没有出现