私は数週間前のようなプロトタイプを作成していますが、まだ実装されていないので、興味深いリンクを投稿しました。私の目標は、Webページ上にC#の「即時の」コンソールを作成することです。
いくつかのアセンブリをプログラムによって読み込んで、明示的に参照する必要があります。
ここにコードがあります。後で解決策を投稿してください、私は知りたいと思うでしょう。
これは実行時にC#コードを記述し、String戻り値を取得することができます。
protected void getImmediateResult_Click(object sender, EventArgs e)
{
//building the code
string source = @"using System;
class MyType{
public static String Evaluate(){
<!expression!>
}}";
string expression = this.txtimmediate.Text;
string finalSource = source.Replace("<!expression!>", expression);
textcodeCheck.Text = finalSource;
var compileUnit = new CodeSnippetCompileUnit(finalSource);
//preparing compilation
CodeDomProvider provider = new Microsoft.CSharp.CSharpCodeProvider();
// Create the optional compiler parameters
//this correctly references the application but no System.Web etc
string[] refArray = new string[2];
UriBuilder uri = new UriBuilder(Assembly.GetExecutingAssembly().CodeBase);
refArray[0] = uri.Path;
//this works
refArray[1] = "System.Web" + ".dll";
////NOT WORKING for non microsoft assemblies
//var allRefs = Assembly.GetExecutingAssembly().GetReferencedAssemblies();
//string[] refArray = new string[allRefs.Length + 1];
//int i = 1;
//foreach (AssemblyName refer in allRefs)
//{
// refArray[i] = refer.Name + ".dll";
// i++;
//}
var compilerParameters = new CompilerParameters(refArray);
CompilerResults compilerResults = provider.CompileAssemblyFromDom(compilerParameters, compileUnit);
if (compilerResults.Errors.Count > 0)
{
//1st error
this.txtResult.Text = compilerResults.Errors[0].ErrorText;
return;
}
//running it
Type type = compilerResults.CompiledAssembly.GetType("MyType");
MethodInfo method = type.GetMethod("Evaluate");
String result = (String)method.Invoke(null, null);
this.txtResult.Text = result;
}
あなたは 'CodeDom'(' CodeSnippetCompileUnit'、 'CSharpCodeProviderを使用している場合'など)、あなたはそのハッキングした文字列ソースを必要としません。コードを使って定型句を構築することができます。 – Kroltan
@Kroltan本当ですか?私は毎回クラスの構文を入力したくありません。 – user6788933
つまり、ボイラープレートは、文字列から解析されずに置換される代わりに、コードで構築できます。この方法では、周囲の定型文ではなく、スニペットでエラーをより確実にレポートします。例(C#6を使用していますが、他のバージョンにも簡単に翻訳できます):http://pastebin.com/5w86FrVb – Kroltan