1

あるプログラマーがコンパイル済みのプログラムをソースコードなしで私に渡したとしましょう。ただし、それを簡単に追加する機能は提供します。しかし、プログラマーは、コンパイルされたプログラム内で人々が対話できるようにするにはどうすればよいでしょうか?

このデモ プログラムは、単純に最大数の乱数を作成し、プログラムの独自の 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();
}
4

4 に答える 4

2

プラグインを作成できます。プラグインが提供することが期待されるすべてのメソッドと関数を記述するインターフェース (すべてのプラグインに共通) を実装します。次に、次のようにプラグインを動的に (実行時に) ロードできます: 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

于 2012-05-19T12:41:11.763 に答える
2

さらに、プラグインを新しいアプリケーション ドメインにロードして、悪意のあることを防止しますが、それは少し高度です ... C# プラグイン システムの記述を参照してください。

于 2012-05-19T12:43:18.673 に答える
0

これを行う最善の方法は、コンパイルされたコードを参照として独自のプロジェクトにインポートすることです。つまり、すべての標準的な .NET 参照と同様に、クラス ライブラリのように使用します。その後、外部ライブラリの背後にソース コードがあることを心配する必要なく、独自のアプリケーションでそのクラスを利用できます。

これを行うには、プロジェクトの下に References フォルダーがあり、これを右クリックして [参照の追加] を選択し、コンパイル済みの .dll または .exe を参照します。追加したらMakeRandom、コードでクラスを使用できます (適切な名前を含めるusingか、名前空間で修飾された名前を使用することを忘れないでください)。

于 2012-05-19T12:32:27.390 に答える
0

このリンクをチェックしてください。あなたが参照しているものも通常プラグインと呼ばれます。基本的には、プラグインの外観をどのように期待するかを定義する、DLL の 1 つからインターフェイスを実装する Class Libary(dll) です。フォルダーをスキャンして追加の DLL を探し、リフレクションを使用してプラグイン インターフェイスを実装するクラスを見つけます。クラスを取得してアセンブリをロードすると、その型のインスタンスを作成して使用できます。

于 2012-05-19T12:42:44.133 に答える