私がやろうとしているのは、ユーザーがテキストボックスにメソッドを記述し、コードでそのメソッドを呼び出せるようにすることです。これは最終的に、目的関数が与えられた最適化のためにデモ アプレットで使用されます。
それで、サンプル コンソール アプリケーションを使用してきましたが、問題が発生しています。スタック オーバーフローや codeproject などのソースを確認し、コードをコンパイルできるところまで来ました。しかし、それを呼び出してメソッドにのみアクセスする方法がわかりません。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;
namespace CodeCompilerTest
{
class Program
{
static void Main(string[] args)
{
CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters parameters = new CompilerParameters();
//parameters.GenerateExecutable = false;
parameters.GenerateInMemory = true;
//parameters.OutputAssembly = "Output.dll";
string SourceString = @"
using System;
using System.Collections.Generic;
using System.Text;
namespace testone
{
public class myclass
{
public double Main()
{
return testd(5,8);
}
public double testd(double a, double b)
{
return a+b;
}
}
}";
CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, SourceString);
if (results.Errors.Count > 0)
{
foreach (CompilerError CompErr in results.Errors)
{
Console.WriteLine("Line number " + CompErr.Line + ", Error Number: " + CompErr.ErrorNumber + ", '" + CompErr.ErrorText + ";");
}
Console.ReadLine();
}
Assembly mAssembly = results.CompiledAssembly;
Type scripttype = mAssembly.GetType("myclass");
Object rslt = new Object();
Object[] argin = {5, 8};
//rslt = scripttype.GetMethod("Main").Invoke(null, null);
rslt = scripttype.InvokeMember("Main", BindingFlags.InvokeMethod | BindingFlags.Public |BindingFlags.Static, null, null, null);
Console.WriteLine(((double)rslt).ToString());
Console.ReadLine();
}
}
}
メソッドで Invoke を呼び出してエラーが発生し続ける方法について、さまざまな組み合わせを試しました。私ができるようにしたいのは、ユーザーに次のような関数を定義させることです:
public double funcname(double x, double y)
{
return x+y;
}
そして、funcname を直接呼び出すことができます。これができない場合は、現時点で入手できるものを使用します。
ヘルプやガイダンスをいただければ幸いです。ありがとう。