定义动态程序集

 namespace DynamicAssembly
{ public class CodeDriver : MarshalByRefObject
{
private string prefix =
"using System;" +
"public static class Driver" +
"{" +
" public static void Run()" +
" {"; private string postfix =
" }" +
"}"; public string CompileAndRun(string input, out bool hasError)
{
//for (int i = 0; i < 10;i++ )
//{ Console.WriteLine(i); }
hasError = false;
string returnData = null; CompilerResults results = null;
using (var provider = new CSharpCodeProvider())
{
var options = new CompilerParameters();
options.GenerateInMemory = true; var sb = new StringBuilder();
sb.Append(prefix);
sb.Append(input);
sb.Append(postfix); results = provider.CompileAssemblyFromSource(options, sb.ToString());
} if (results.Errors.HasErrors)
{
hasError = true;
var errorMessage = new StringBuilder();
foreach (CompilerError error in results.Errors)
{
errorMessage.AppendFormat("{0} {1}", error.Line, error.ErrorText);
}
returnData = errorMessage.ToString();
}
else
{
TextWriter temp = Console.Out;
var writer = new StringWriter();
Console.SetOut(writer);
Type driverType = results.CompiledAssembly.GetType("Driver"); driverType.InvokeMember("Run", BindingFlags.InvokeMethod |
BindingFlags.Static | BindingFlags.Public,
null, null, null); Console.SetOut(temp); returnData = writer.ToString();
} return returnData;
}
}
}

编写调用代码

 namespace DynamicAssembly
{
public class CodeDriverInAppDomain
{
public string CompileAndRun(string code, out bool hasError)
{
AppDomain codeDomain = AppDomain.CreateDomain("CodeDriver"); CodeDriver codeDriver = (CodeDriver)
codeDomain.CreateInstanceAndUnwrap("DynamicAssembly",
"DynamicAssembly.CodeDriver"); string result = codeDriver.CompileAndRun(code, out hasError); AppDomain.Unload(codeDomain); return result;
} }
}

wpf 页面代码

 <Window x:Class="DynamicAssembly.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="" Width="">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="Auto" MinWidth="" />
</Grid.ColumnDefinitions>
<TextBox x:Name="textCode" AcceptsReturn="True" AcceptsTab="True" Grid.Row="" Grid.Column="" Margin="" />
<Button Click="Compile_Click" Grid.Row="" Grid.Column="" Content="Compile and Run" Margin="5, 10, 5, 10" />
<TextBlock x:Name="textOutput" Grid.Row="" Grid.Column="" Grid.ColumnSpan="" Margin="" />
</Grid> </Window>

后台代码

  private void Compile_Click(object sender, RoutedEventArgs e)
{
// var custom = new CustomClassDamain();
// string s = custom.CompileAndRun(); textOutput.Background = Brushes.White;
var driver = new CodeDriverInAppDomain();
bool isError;
textOutput.Text = driver.CompileAndRun(textCode.Text, out isError);
if (isError)
{
textOutput.Background = Brushes.Red;
} }

最新文章

  1. 从零开始,DIY一个jQuery(1)
  2. [ERROR] Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:2.4:create (default-cli) on project standalone-pom: Unable to parse configuration of 3: mojo org.apache.maven.plugins:
  3. c++实现之 -- 文章TF-IDF值的计算
  4. 【转】asp.net连接数据库字符串有哪些写法[数据连接]
  5. JavaScript trim 实现(去除字符串首尾指定字符)
  6. LINUX系统怎么关闭防火墙?
  7. Windows Mobile 6.0 SDK和中文模拟器下载
  8. Measuring Lengths in Baden
  9. jQuery.attributes源码分析(attr/prop/val/class)
  10. sscanf用法
  11. Android版数据结构与算法(一):基础简介
  12. Synchronize,Lock, ReentrantLock,ReentrantReadWriteLock
  13. java 运行 .jar 文件乱码
  14. Java HashMap源码分析
  15. ie11 下 input 默认有 X 关闭按钮的问题
  16. 类文件结构与javap的使用
  17. “全栈2019”Java多线程第十四章:线程与堆栈详解
  18. Ubuntu16.04 下安装tomcat
  19. [Code Festival 2017 qual A] B: flip
  20. XmlSerialize

热门文章

  1. lubuntu踩坑全记录
  2. 程序计数器(关于java虚拟机内存的那些事)
  3. Word 查找替换高级玩法系列之 -- 把论文中的缩写词快速变成目录下边的注释表
  4. PAT甲级 字符串处理题_C++题解
  5. CentOS7 服务器连接超时自动断开问题解决
  6. Docker相关环境全套安装文档兼小技能
  7. (四)resultMap、sql片段与动态SQL
  8. 组装技术的新进展 New advances in sequence assembly.
  9. mysql 2 修改表
  10. 创建多线程时,为何创建后需要Sleep?