1. 首页 > 电脑教程 > 动态执行页面输入代码

动态执行页面输入代码

前台代码:TextBox实现换行 加上 TextWrapping="Wrap" AcceptsReturn="True" 两个属性就行了。

后台代码:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;using System.Reflection;using Microsoft.CSharp;using System.CodeDom.Compiler;using System.IO;namespace WpfAssembly{///

/// Window1.xaml 的交互逻辑/// public partial class Window1 : Window{public Window1(){InitializeComponent();}private void button1_Click(object sender, RoutedEventArgs e){CodeDriver driver = new CodeDriver();bool isError;textBlock1.Text = driver.ComplileAndRun(textBox1.Text,out isError);//调用执行代码的类if (isError){textBlock1.Background = Brushes.Red;}else{textBlock1.Background = Brushes.NavajoWhite;}}}public class CodeDriver{private string prefix = "using System;" +"public static class Driver" +"{" +"public static void Run()" +"{";private string postfix = "}" + "}";public string ComplileAndRun(string input, out bool hasError){hasError = false;string returnData = null;CompilerResults results = null;using (CSharpCodeProvider provider = new CSharpCodeProvider())//c#代码生成器和编译器的实例{CompilerParameters options = new CompilerParameters();options.GenerateInMemory = true;//是否从内存输出StringBuilder sb = new StringBuilder();sb.Append(prefix);sb.Append(input);sb.Append(postfix);results = provider.CompileAssemblyFromSource(options, sb.ToString());//向编译器输入代码字符}if (results.Errors.HasErrors)//代码运行是否正常{hasError = true;StringBuilder sb = new StringBuilder();foreach (CompilerError error in results.Errors){sb.AppendFormat("{0} {1}", error.Line, error.ErrorText);}returnData = sb.ToString();}else{TextWriter tw = Console.Out;StringWriter sw = new StringWriter();Console.SetOut(sw);//接受输出的字符串Type driverType = results.CompiledAssembly.GetType("Driver");//反射获取Driver类//指定执行函数的参数列表driverType.InvokeMember("Run", BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public, null, null, null);Console.SetOut(tw);returnData = sw.ToString();}return returnData;}}}

声明:希维路由器教程网提供的内容,仅供网友学习交流,如有侵权请与我们联系删除,谢谢。ihuangque@qq.com
本文地址:https://www.ctrlcv.com.cn/diannao/169347610010829.html