与下位机或设备的通信解析优化的一点功能(续补):动态编译
时间:2019-03-19
本文章向大家介绍与下位机或设备的通信解析优化的一点功能(续补):动态编译,主要包括与下位机或设备的通信解析优化的一点功能(续补):动态编译使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
继上一篇《与下位机或设备的通信解析优化的一点功能:T4+动态编译》 ,现在已经生成出解析用的类的C#源码了,接下来,就轮到动态编译生成Type了。
在实现上,。net framework和。net core上,有些不同:
.Net Framework的:
1 var transfer = ""; //解析后的C#源码字符串 2 3 ICodeCompiler comp = new CSharpCodeProvider().CreateCompiler(); 4 5 //编译器的传入参数 6 CompilerParameters cp = new CompilerParameters(); 7 8 //引入对应的dll 9 cp.ReferencedAssemblies.Add("system.dll"); //添加程序集 system.dll 的引用 10 cp.ReferencedAssemblies.Add("system.data.dll"); //添加程序集 system.data.dll 的引用 11 cp.ReferencedAssemblies.Add("system.xml.dll"); //添加程序集 system.xml.dll 的引用 12 cp.ReferencedAssemblies.Add("Kugar.Core.dll"); 13 cp.ReferencedAssemblies.Add("Newtonsoft.Json.dll"); 14 cp.ReferencedAssemblies.Add("Kugar.GPS.Api.Data.dll"); 15 cp.ReferencedAssemblies.Add("Kugar.GPS.Api.BLL.dll"); 16 cp.ReferencedAssemblies.Add("MongoDB.Bson.dll"); 17 cp.ReferencedAssemblies.Add("MongoDB.Driver.Core.dll"); 18 19 cp.GenerateExecutable = false; //不生成可执行文件 20 cp.GenerateInMemory = true; //在内存中运行 21 cp.IncludeDebugInformation = false; 22 23 CompilerResults results = comp.CompileAssemblyFromSource(cp, transfer); 24 25 if (results.Errors.HasErrors) 26 { 27 foreach (CompilerError error in results.Errors) 28 { 29 LoggerManager.Default.Debug("生成类出错:" + error.ErrorText); 30 } 31 32 return null; 33 } 34 35 //获取生成后的应用程序集中,对应的类Type 36 var type = results.CompiledAssembly.GetTypes() 37 .Where(x => x.IsImplementlInterface(typeof(IProtocolExecutor))).FirstOrDefault(); 38 39 return (IProtocolExecutor) Activator.CreateInstance(type, newProtocol.ProtocolID,newProtocol.Version); //实例化解析类
.Net Core 下的:
Nuget下安装 System.Runtime.Loader,System.CodeDom,Microsoft.CodeAnalysis.CSharp包
1 var transfer = ""; //T4生成出来的C#源码 2 3 SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(transfer); 4 5 6 string assemblyName = Path.GetRandomFileName(); 7 MetadataReference[] references = null; 8 9 try 10 { 11 //添加当前应用程序域里所有的dll引用 12 references = DependencyContext.Default 13 .CompileLibraries 14 .SelectMany(x => x.ResolveReferencePaths(new ReferenceAssemblyPathResolver())) 15 .Where(path => !string.IsNullOrWhiteSpace(path)) 16 .Select(path => MetadataReference.CreateFromFile(path)).ToArrayEx(); 17 18 19 } 20 catch (Exception e) 21 { 22 Console.WriteLine(e); 23 throw; 24 } 25 26 CSharpCompilation compilation = CSharpCompilation.Create( 27 assemblyName, 28 syntaxTrees: new[] { syntaxTree }, 29 references: references, 30 options:new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary) 31 ); 32 33 using (var ms = new MemoryStream()) 34 { 35 EmitResult result = compilation.Emit(ms); 36 37 if (!result.Success) 38 { 39 IEnumerable<Diagnostic> failures = result.Diagnostics.Where(diagnostic => 40 diagnostic.IsWarningAsError || 41 diagnostic.Severity == DiagnosticSeverity.Error); 42 43 foreach (Diagnostic diagnostic in failures) 44 { 45 Console.Error.WriteLine("\t{0}: {1}", diagnostic.Id, diagnostic.GetMessage()); 46 } 47 48 return null; 49 } 50 else 51 { 52 ms.Seek(0, SeekOrigin.Begin); 53 54 Assembly assembly = AssemblyLoadContext.Default.LoadFromStream(ms); 55 56 var type = assembly.GetTypes() 57 .Where(x => x.IsImplementlInterface(typeof(IProtocolExecutor))).FirstOrDefault(); 58 59 return (IProtocolExecutor)Activator.CreateInstance(type, newProtocol.ProtocolID, newProtocol.Version); //实例化解析类 60 61 } 62 }
两种框架下的生成稍微有点不同,列出来,,复制粘贴一下,,改一改就可以用上去了
- 原来Silverlight 4中是可以玩UDP的!
- Flash/Flex学习笔记(12):FMS 3.5之如何做视频实时直播
- Flash/Flex学习笔记(11):如何检测摄像头是否被占用
- Flash/Flex学习笔记(10):FMS 3.5之Hello World!
- Swarm基于多主机容器网络-overlay networks 梳理
- 未来AI可能会淘汰180万个工作岗位,你感到恐惧了吗
- css基础:把所有背景图都集成在一张图片上,减少图片服务器请求次数
- Docker可视化界面(Consul+Shipyard+Swarm+Service Discover)部署记录
- windows 2008上启用防火墙后sqlserver 2005经常出现连接超时的解决办法
- 重温delphi之控制台程序:Hello World!
- Docker集中化web界面管理平台-Shipyard部署记录
- "Goole项目托管"及"CodePlex发布开源项目"要点
- Docker网络解决方案-Calico部署记录
- c#中开发ActiveX的学习笔记
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 告别传统工业互联网,提高数字管控思维:三维组态分布式能源站
- 爱奇艺iOS移动端网络优化实践:请求成功率优化
- Java数据类型
- Python爬虫之scrapy构造并发送请求
- Python爬虫之scrapy模拟登陆
- Python爬虫之scrapy中间件的使用
- Python爬虫之scrapy_redis原理分析并实现断点续爬以及分布式爬虫
- Python爬虫之scrapy_splash组件的使用
- Python爬虫之scrapy的日志信息与配置
- Python爬虫之scrapyd部署scrapy项目
- 最近发现一个很有趣的随机小姐姐视频源码 分享给大家
- Codeforces Round #633 (Div. 2)C Powered Addition (贪心,二进制)
- Spring 整合 JUnit
- Java Stax解析XML示例
- Codeforces Round #633 (Div. 2) B Sorted Adjacent Differences(直观感知+排序插放)