文字列から任意のメソッドを実行するシンプルで高速な関数をC#で作成することは可能ですか?たとえば、MyString = "MessageBox.Show(" Some Message ")"を設定してからExecuteString(MyString)を呼び出すと、メッセージボックスに「SomeMessage」が表示されます。
(上記のコードで何らかのエラーが発生した可能性があります。C#はまだわかりません。特定のプロジェクトに適しているかどうかを評価しようとしています。)
文字列から任意のメソッドを実行するシンプルで高速な関数をC#で作成することは可能ですか?たとえば、MyString = "MessageBox.Show(" Some Message ")"を設定してからExecuteString(MyString)を呼び出すと、メッセージボックスに「SomeMessage」が表示されます。
(上記のコードで何らかのエラーが発生した可能性があります。C#はまだわかりません。特定のプロジェクトに適しているかどうかを評価しようとしています。)
これを使用して、文字列を実行するために必要なコードを関数にラップできるはずです。
基本的に、C#コードの一部をスタイル関数でラップし、Program.Mainいくつかのアセンブリを参照して基本機能(おそらく独自のアセンブリを含む)を実行してから、コンパイルされたプログラムをメモリ内で実行します。
1行または2行のコードを実行するだけの場合よりも、オーバーヘッドが少し増える可能性があります。
あなたが探しているように見えるのはCS-Scriptです
残念ながら、C#はそのように動的言語ではありません。これを簡単に行うことはできません。本当に必要な場合は、IronPythonやIronRubyなどのニーズに合わせて.Net言語を使用することを検討してください。
このフォーラムスレッドからのこの本当に複雑で凶悪な例が示すように、利用可能な最善の代替手段は、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});
}
}
}
}