1

リアルタイムでテキストに色を付けるシンプルなテキストエディタを作成しようとしています。また、これにはDLLとReflectionを使用する必要があります。ユーザーが入力しているときにテキストに色を付けたい。そのため、チェックボックスがあります。チェックすると、ユーザーが入力しているときにテキストが色付けされます(リアルタイム)。

そのためのDLLファイルを作成しました。

とにかく、私は反射の事に非常に新しいです。

  • 質問:

私が書いたものが「リフレクションを使う」と呼べるかどうか、専門家のアドバイスをお願いしたいと思います。そうでない場合は、何が問題なのかを教えてもらえますか?

これが私のコードです(コードが質問を反映するように多くのものを削除しましたが、残り物があるかもしれません)

using System;
using System.Drawing;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
using System.Reflection;

namespace Editor
{
    public class MainForm : Form
    {
        //Declaration of Controls 
        private RichTextBox EditRichTextBox;
        private CheckBox chkBox;
        private int flag = 0;

        private Button[] PlugButton;
        public string[] PluginNames;
        private int NumofPlugins;

        public MainForm()
        {
            //Initialization of Controls
            this.EditRichTextBox = new RichTextBox();
            this.ErrorTextBox = new RichTextBox();
        this.chkBox = new CheckBox();

            //Form
            this.ClientSize = new Size(700, 500);
            this.Name = "MainForm";
            this.Text = "C# Editor";

            //EditRichTextBox
            this.EditRichTextBox.Location = new Point(20, 20);
            this.EditRichTextBox.Name = "EditRichTextBox";
            this.EditRichTextBox.Size = new Size(this.Width - 150, 300);
            this.EditRichTextBox.AcceptsTab = true;
            this.EditRichTextBox.Multiline = true;

            //Controls on the Form
        this.Controls.Add(this.ButtonCompilelib);
            this.Controls.Add(this.ButtonCompile);
            this.Controls.Add(this.ButtonRun);
            this.Controls.Add(this.EditRichTextBox);
            this.Controls.Add(this.ErrorTextBox);
        this.Controls.Add(this.chkBox);

        //CheckBox
        this.chkBox.Location = new Point(600,300);
            this.chkBox.Name = "chkBox";
            this.chkBox.Text = "Color";
        };

        //My checkbox handler
        this.chkBox.Click += (sender,e) =>
        {
            if(flag == 0)
            {
                flag = 1;
                MessageBox.Show("Coloring Text");
                }
            else 
                flag = 0;
        };

        //My TextBox handler
        this.EditRichTextBox.KeyPress += (sender,e) =>
        {
            try
            {
                string tmp = Environment.CurrentDirectory + "\\" + "mydll" + ".dll";            Assembly a = Assembly.LoadFrom(tmp);
                Type t = a.GetType("MyPlugIn.colorclass");
                MethodInfo mi = t.GetMethod("color");
                Object obj = Activator.CreateInstance(t);

                Object[] Params = new Object[5];
                Params[0] = EditRichTextBox.Text;
                Params[1] = EditRichTextBox.Handle;
                Params[2] = ErrorTextBox.Handle;
                Params[3] = EditRichTextBox;
                Params[4] = flag;
                mi.Invoke(obj, Params);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        };


        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new MainForm());
        }
    }
}

そしてこれはDLLファイルです

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace MyPlugIn
{
    public class colorclass
    {
        public void color(string Text, Object Hndl_Text, Object Hndl_Err, RichTextBox box,int flag)
        {
            if (flag == 1)
            {
                int start = box.TextLength;
                int end = box.TextLength;

                //Textbox may transform chars, so (end-start) != text.Length
                box.Select(start, end - start);
                {
                    box.SelectionColor = Color.Blue;
                }
                box.SelectionLength = 0; // clear
            }
        }
    }
}
4

1 に答える 1

2

はい、コードはReflectionを使用しています。これらの行は一例です。

Type t = a.GetType("MyPlugIn.colorclass");
MethodInfo mi = t.GetMethod("color");
Object obj = Activator.CreateInstance(t);

最善のアプローチであるかどうか、またはこのタスクに必要であるかどうかは、別のトピックです。

于 2013-01-10T18:32:51.810 に答える