定义动态程序集

 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;
} }

C# 动态加载程序集的更多相关文章

  1. C# 动态加载程序集dll (实现接口)

    一.程序集(接口程序集):LyhInterface.Dll namespace LyhInterface { public interface ILyhInterface { void Run(); ...

  2. C#动态加载程序集(转)

    C#动态加载程序集 今天在看网络上的一篇关于‘.NET应用自动部署窗体技术’.NET的自动部署技术构造在.NET框架之中,它使得应用程序能够通过HTTP连接从远程服 务器按需下载程序集.有了这个功能, ...

  3. .Net Core 通过依赖注入和动态加载程序集实现宿程序和接口实现类库完全解构

    网上很多.Net Core依赖注入的例子代码,例如再宿主程序中要这样写: services.AddTransient<Interface1, Class1>(); 其中Interface1 ...

  4. C# 动态加载程序集信息

    本文通过一个简单的实例,来讲解动态加载Dll需要的知识点.仅供学习分享使用,如有不足之处,还请指正. 在设计模式的策略模式中,需要动态加载程序集信息. 涉及知识点: AssemblyName类,完整描 ...

  5. Assembly.Load动态加载程序集而不占用文件 z

    方式一:占用文件的加载 Assembly assembly = Assembly.Load(path); 用上面的方法可以动态的加载到dll,但是用这种方法加载到的dll一直到程序运行结束都是占用的d ...

  6. 应用程序域 System.AppDomain,动态加载程序集

    一.概述 使用.NET建立的可执行程序 *.exe,并没有直接承载到进程当中,而是承载到应用程序域(AppDomain)当中.在一个进程中可以包含多个应用程序域,一个应用程序域可以装载一个可执行程序( ...

  7. C# 反射实现动态加载程序集

    原文:https://blog.csdn.net/pengdayong77/article/details/47622235 在.Net 中,程序集(Assembly)中保存了元数据(MetaData ...

  8. 关于c#动态加载程序集的一些注意事项

    Assembly下有LoadFile,LoadFrom等方法可以加载程序集. LoadFile只加载你给定路径的那个dll,LoadFrom会自动加载依赖的dll. 如:A依赖B,LoadFile(& ...

  9. asp.net动态加载程序集创建指定类的实例及调用指定方法

    以下类中有三个方法: LoadAssembly:加载指定路径的程序集 GetInstance:根据Type动态获取实例,用泛型接到返回的类型 ExecuteMothod:执行实例中的指定方法 /// ...

随机推荐

  1. Beanshell post processor写文件

    byte[] responseData = prev.getResponseData().; private String filePath = "F:/test.txt"; Bu ...

  2. CSP-S初赛

    初赛都过了好几天了,现在才想起来写点关于初赛的博客也真是...... 我是福建人,是在福建的赛点参加的CSP-S组的初赛,能力其实很弱,估分只能60多一点点.真是害怕一不小心这篇博客就变成了我的退役博 ...

  3. 利用Python进行数据分析_Pandas_层次化索引

    申明:本系列文章是自己在学习<利用Python进行数据分析>这本书的过程中,为了方便后期自己巩固知识而整理. 层次化索引主要解决低纬度形式处理高纬度数据的问题 import pandas ...

  4. Django Simple Captcha的使用

    Django Simple Captcha的使用 1.下载Django Simple Captcha django-simple-captcha官方文档地址 http://django-simple- ...

  5. 解决 windows oracle ORA-01113和ORA-01110错误

    windows2008上的数据库版本为11.2.0.4.0,数据库打开为mount状态.报错如下: SQL> startup ORACLE instance started. Total Sys ...

  6. 项目遇到的问题:页面c:forEach循环的数据进行计算传回后台并保持到数据库

    应该还有更简单的方法 但是我不晓得 手动给文本框输入数据保存到数据库 A表 :通过订单编号 查询数据获得 B表 :通过A表中的字段查询遍历获得 问题: 手动输入文本框内容 保存到数据库 页面form提 ...

  7. 入手线段树 hdu1754

    今天学习了线段树的三个基本操作 建树 更新 查找 先理解下什么是线段树就这个题目而言 如果我们用普通的数组去存放 然后依次遍历访问的话 时间太多了线段树利用了二分的思想 把数据以段的形式进行储存 这样 ...

  8. 在sublime3中运行python文件

    1.首先下载Sublime和Python,安装Python环境 注意:如果不想动手亲自配置Python环境安装的时候环境变量,请在安装的界面给Add Python 3.5 To Path前面打上对号. ...

  9. pandas简介

  10. Spring的SSM标准配置

    一.首先是web.xml文件的配置 <welcome-file-list> <!--设置默认显示登陆界面--> <welcome-file>login.jsp< ...