C# 动态加载程序集
定义动态程序集
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# 动态加载程序集的更多相关文章
- C# 动态加载程序集dll (实现接口)
一.程序集(接口程序集):LyhInterface.Dll namespace LyhInterface { public interface ILyhInterface { void Run(); ...
- C#动态加载程序集(转)
C#动态加载程序集 今天在看网络上的一篇关于‘.NET应用自动部署窗体技术’.NET的自动部署技术构造在.NET框架之中,它使得应用程序能够通过HTTP连接从远程服 务器按需下载程序集.有了这个功能, ...
- .Net Core 通过依赖注入和动态加载程序集实现宿程序和接口实现类库完全解构
网上很多.Net Core依赖注入的例子代码,例如再宿主程序中要这样写: services.AddTransient<Interface1, Class1>(); 其中Interface1 ...
- C# 动态加载程序集信息
本文通过一个简单的实例,来讲解动态加载Dll需要的知识点.仅供学习分享使用,如有不足之处,还请指正. 在设计模式的策略模式中,需要动态加载程序集信息. 涉及知识点: AssemblyName类,完整描 ...
- Assembly.Load动态加载程序集而不占用文件 z
方式一:占用文件的加载 Assembly assembly = Assembly.Load(path); 用上面的方法可以动态的加载到dll,但是用这种方法加载到的dll一直到程序运行结束都是占用的d ...
- 应用程序域 System.AppDomain,动态加载程序集
一.概述 使用.NET建立的可执行程序 *.exe,并没有直接承载到进程当中,而是承载到应用程序域(AppDomain)当中.在一个进程中可以包含多个应用程序域,一个应用程序域可以装载一个可执行程序( ...
- C# 反射实现动态加载程序集
原文:https://blog.csdn.net/pengdayong77/article/details/47622235 在.Net 中,程序集(Assembly)中保存了元数据(MetaData ...
- 关于c#动态加载程序集的一些注意事项
Assembly下有LoadFile,LoadFrom等方法可以加载程序集. LoadFile只加载你给定路径的那个dll,LoadFrom会自动加载依赖的dll. 如:A依赖B,LoadFile(& ...
- asp.net动态加载程序集创建指定类的实例及调用指定方法
以下类中有三个方法: LoadAssembly:加载指定路径的程序集 GetInstance:根据Type动态获取实例,用泛型接到返回的类型 ExecuteMothod:执行实例中的指定方法 /// ...
随机推荐
- 3种PHP实现数据采集的方法
https://www.php.cn/php-weizijiaocheng-387992.html
- 新浪sae对storage的文档进行读写操作
有的人喜欢将一些数据写在服务器的文件里面,并不喜欢存在mysql里,但新浪sae却不支持对本地文件进行操作. 不过sae拓展了一个storage的服务,可以将一些静态文件放在上面.本文不介绍文件的上传 ...
- js — 数组Array
目录 1. isArray 2. 转换方法 3. 分割字符串 join 4. 栈方法 5. 队列方法 6. 重排序方法 7. 操作方法 8. 位置方法 - 索引 9. 迭代方法 数组 array 解释 ...
- Python笔记003-字符串(1)
1. 字符串基本特点 很多人初学编程时,总是担心自己数学不行,潜意识里认为数学好才能更好编程.但实际上,大多数程序员打交道最多的是 “ 字符串 ” 而不是 “ 数字 ”.因为,编程时用来解决现实问题的 ...
- I2C的协议层和物理层
I2C 协议简介 I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART.CAN 等通讯协议的 ...
- 少儿编程 | 02.Scratch编程环境
上次课程介绍了Scratch的基本概念和一些特点,最后还给出了一些有趣的例子.本次课程介绍Scratch的两种编程环境以及在Scratch官网注册个人账号的步骤. Scratch 3.0的两种编程环境 ...
- Comet OJ - Contest #5 简要题解
好久没更博了,还是象征性地更一次. 依然延续了简要题解的风格. 题目链接 https://cometoj.com/contest/46 题解 A. 迫真字符串 记 \(s_i\) 表示数字 \(i\) ...
- 轻松搭建CAS 5.x系列(8)-在CAS Server增加双因素认证(DUO版)
概述说明 为了让系统更加安全,很多登录会加入双因素认证.何为双因素,如果把登陆作为开一扇门的话,那就是在原来的锁上再加一把锁,第二锁用新的钥匙,这样安全系数就更加高了. CAS是通过账号名和密码来认证 ...
- metronic-v4.6 使用经验
1.弹框居中显示 上下居中 需要上下居中引用 bootstrap-modalmanager.js 左右居中 修改 bootstrap-modal.js 中 this.$element.css('ma ...
- MSSql-SP_who分析数据库性能
https://blog.csdn.net/xiaoxu0123/article/details/5757640 https://www.cnblogs.com/kelelipeng/p/104959 ...