Roslyn:The invoked member is not supported in a dynamic assembly.
Roslyn: 是一个.NET 编译平台,支持C#, Nuget 包:Microsoft.CodeAnalysis.CSharp.dll.
C#动态编译代码,快速上手,代码如下:如题所示,报这个错误的解决办法:
var assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(s => !s.IsDynamic && !string.IsNullOrEmpty(s.Location));
项目
public string Execute(string code){try{string id = "demo1";var assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(s => !s.IsDynamic && !string.IsNullOrEmpty(s.Location));var refs = assemblies.Select(x => MetadataReference.CreateFromFile(x.Location));var compilation = CSharpCompilation.Create($"{id}.dll").WithOptions(new CSharpCompilationOptions(Microsoft.CodeAnalysis.OutputKind.DynamicallyLinkedLibrary,usings: null,optimizationLevel: OptimizationLevel.Release,checkOverflow: false,allowUnsafe: true,platform: Platform.AnyCpu,warningLevel: 4,xmlReferenceResolver: null)).AddReferences(refs).AddSyntaxTrees(CSharpSyntaxTree.ParseText(code));using (var ms = new MemoryStream()){var result = compilation.Emit(ms);if (result.Success){ms.Seek(0, SeekOrigin.Begin);var assembly = Assembly.Load(ms.ToArray());var invokeType = assembly.GetTypes().First(x => x.Name == "CSCode");var dynamicType = Activator.CreateInstance(invokeType);return (string)invokeType.GetMethod("Execute").Invoke(dynamicType, new object[] { new MyClass(){ Id="1111"} });}var error = new StringBuilder();foreach (var t in result.Diagnostics){error.AppendLine($"{t.GetMessage()}");}return error.ToString();}}catch (Exception ex){return ex.Message;}}
准备的待编译class文件代码如下:
using Newtonsoft.Json;
namespace DynamicExpresso.Services
{public class CSCode{class MsgInfo{public string Id { get; set; }public string DisplayCode { get; set; }public string DisplayName { get; set; }}public string Execute(MyClass classObj){// 获取对象, 测试MsgInfo msgInfo = JsonConvert.DeserializeObject<MsgInfo>(classObj.Demo);string redisKey = msgInfo.Id;//访问Redis测试bool redisResult = RedisHelper.Set(redisKey, "hello,world#!@#", 1000);string result = RedisHelper.Get(redisKey);//访问数据库测试var dataBaseRepo = new RepositoryBase<MyClass>();var collections= dataBaseRepo.Query(x => x.Id == "123");return JsonConvert.SerializeObject(collections);}}
}
实际测试:动态代码编译后,并非同所在工程隔离,且是利用了所在项目工程的上下文运行时环境,处于同一个AppDomain中(注意命名空间保持一致) 。
Roslyn:The invoked member is not supported in a dynamic assembly.相关推荐
- out参数不用赋值?这么神奇吗!
首先提醒大家一下,docs.microsoft.com上的<C# 指南>是这样描述out 参数修饰符[1]的: 作为 out 参数传递的变量在方法调用中传递之前不必进行初始化.但是,被调用 ...
- Java中常见的单词
abstract (关键字) 抽象 ['.bstr.kt] access vt.访问,存取 ['.kses]'(n.入口 ...
- 【计算机基础】中英文常用名词对照
abstract (关键字) 抽象 ['.bstr.kt] access vt.访问,存取 ['.kses]'(n.入口,使用权) algorithm n.算法 ['.lg.riem] annotat ...
- java必备英语单词
abstract (关键字) 抽象 ['.bstr.kt] access vt.访问,存取 ['.kses]'(n.入口,使用权) algorithm n.算法 ['.lg.riem] annotat ...
- java常用英语单词
abstract (关键字) 抽象 ['.bstr.kt] access vt.访问,存取 ['.kses]'(n.入口,使用权) algorithm n.算法 ['.lg.riem] annotat ...
- 【转】Java 专业词汇
原址:http://blog.csdn.net/xiaojunjuns1/article/details/52729861 abstract (关键字) 抽象 ['.bstr. ...
- 11、java常用单词(转载)
abstract (关键字) 抽象 ['.bstr.kt] access vt.访问,存取 ['.kses]'(n.入口,使用权) algorithm n.算法 ['.lg.riem] annotat ...
- java中常见的英语单词
abstract (关键字) 抽象 ['.bstr.kt] access vt.访问,存取 ['.kses]'(n.入口 ...
- 【强化学习】解决gym安装Atari2600环境gym[atari,accept-rom-license] RuntimeError 无法下载Roms的问题
先上Roms.tar.gz安装地址:Roms.tar.gz 以下内容是解决问题的思路,如果已经完全知道问题原因可以直接跳过 安装gym[accept-rom-license]时会出现安装失败的情况: ...
最新文章
- vijos 1512 SuperBrother打鼹鼠
- juniper防火墙做ipsec ***必须开放的端口
- docker 镜像的使用和下载
- 【缺迪杰斯特拉和SPFA] 文巾解题 787. K 站中转内最便宜的航班
- sklearn自学指南(part61)--调整估计器的超参数
- 网络经济与企业管理(第 2 章:企业战略管理)
- [Sdoi2010] 地精部落
- babylonjs 设置面板位置_一篇关于开关面板的详细集合,值得收藏转发
- python案例实操_用案例实操学习Python ,培养编程逻辑思维
- ROS入门笔记(十三):分布式通信
- 硬核 App,这项新功能一定要打开,关键时刻能救命!!
- C#算法 质因数 最大公约数与最小公倍数
- 去掉ul标签前的小圆点
- js复制隐藏域中的文字
- .tar.gz和.tar.bz2解压命令
- HTML颜色表及html代码(前端必备)
- 文件及代码代码命名规则
- 论文中定性分析与定量分析的写作手法
- 如何解决个人信息泄露问题
- 解决WIN10系统电脑右下角网络图标不见网络无法连接的方法总结(2021.1030)