C #: выполнить функцию, хранящуюся в строковой переменной - PullRequest
5 голосов
/ 21 января 2010

Можно ли написать простую и быструю функцию на C #, которая будет выполнять произвольные методы из строки? Например, если я установлю MyString = "MessageBox.Show (" Some Message ")" и затем вызову ExecuteString (MyString), появится окно с сообщением "Some Message".

(Возможно, я допустил какую-то ошибку в приведенном выше коде. Я еще не знаю C #; я пытаюсь оценить, будет ли это подходить для конкретного проекта.)

Ответы [ 3 ]

3 голосов
/ 21 января 2010

Вы должны быть в состоянии использовать это и обернуть код, необходимый для запуска строки в функцию.

По сути, вы оборачиваете небольшой кусочек кода C # в функцию стиля Program.Main, ссылаясь на некоторые сборки для базовой функциональности (возможно, включая вашу собственную сборку), затем запускаете скомпилированную программу в памяти.

Скорее всего, это немного больше, чем просто запуск одной или двух строк кода.

http://support.microsoft.com/kb/304655

3 голосов
/ 10 августа 2011

То, что вы ищете, это CS-Script

2 голосов
/ 21 января 2010

Увы, C # не является динамическим языком в этом смысле. Вы не можете легко сделать это легко, и если это действительно то, что вам нужно, рассмотрите возможность использования языка .Net, более соответствующего вашим потребностям, такого как IronPython или IronRuby.

Ваша лучшая доступная альтернатива - использовать пространство имен CodeDom, поскольку этот действительно запутанный и отвратительный пример из этой ветки форума показывает:

using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Text;
using System.Windows.Forms;

namespace TestApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        SampleLib.SampleType test = new SampleLib.SampleType();

        private void button1_Click(object sender, EventArgs e)
        {
            // Dynamically build and call the method
            label1.Text = test.MyText;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            StringBuilder DynamicCode = new StringBuilder();
            DynamicCode.Append("namespace TestDynamic");
            DynamicCode.Append("{");
            DynamicCode.Append("public class DynamicCode");
            DynamicCode.Append("{");
            DynamicCode.Append("public static void EditText(SampleLib.SampleType t)");
            DynamicCode.Append("{");
            DynamicCode.Append("t.MyText = \"Goodbye!\";");
            DynamicCode.Append("}");
            DynamicCode.Append("}");
            DynamicCode.Append("}");

            string CodeString = DynamicCode.ToString();

            System.IO.FileInfo fi = new System.IO.FileInfo(Application.ExecutablePath);
            CodeDomProvider provider = CodeDomProvider.CreateProvider("C#");
            CompilerParameters CompileParams = new CompilerParameters(new string[] { fi.DirectoryName + "\\SampleLib.dll" },
                fi.DirectoryName + "\\Dynamic.dll");
            CompileParams.MainClass = "DynamicCode";
            CompileParams.GenerateExecutable = false;
            //CompileParams.GenerateInMemory = true;
            CompilerResults r = provider.CompileAssemblyFromSource(CompileParams, new string[] {CodeString});
            foreach (CompilerError er in r.Errors)
            {
                Console.WriteLine(er.ErrorText);
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            // Dynamically call assembly
            System.IO.FileInfo fi = new System.IO.FileInfo(Application.ExecutablePath);
            Assembly dynAsm = Assembly.LoadFile(fi.DirectoryName + "\\Dynamic.dll");
            if (dynAsm != null)
            {
                object o = dynAsm.CreateInstance("TestDynamic.DynamicCode", true);
                Type t = dynAsm.GetType("TestDynamic.DynamicCode");
                t.GetMethod("EditText").Invoke(o, new object[]{test});
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...