哪个网站可以免费做国外网站,一个服务器如何建设多个网站,天津业之峰装饰公司官网,wordpress企业站主题Rosyln介绍Rosyln1 是 .NET Core和 .NET 4.6 中 的C# 、VB的编译器#xff0c;宇宙最强IDE Visual Studio 也是使用其来编译代码的#xff0c; 基于编译器也是服务的理念#xff0c;微软开发者把其独立出来#xff0c;并开源维护#xff0c;开源地址参见注脚2。在工作流引… Rosyln介绍Rosyln1 是 .NET Core和 .NET 4.6 中 的C# 、VB的编译器宇宙最强IDE Visual Studio 也是使用其来编译代码的 基于编译器也是服务的理念微软开发者把其独立出来并开源维护开源地址参见注脚2。在工作流引擎 或是规则引擎中有时候都需要一项功能是计算表达式 以前我们通常借助于Antlr 3 ,根据特殊的语法文法来构建复杂的解析器代码。它就像是一个用于语言解析的加强版的正则表达式。当然你也可以采用目前流行的解释型语言引擎来完成此事可以参考我之前的文章有一篇有关Javascript引擎的介绍。Rosyln 下也有一个类似的C#编译器脚本引擎 C# Scripting API 4 来完成 类似下面的表达式评估。安装包 * Microsoft.CodeAnalysis.CSharp.Scripting*int result await CSharpScript.EvaluateAsyncint(1 2);
实时编译c#文本为dll最新的包 Microsoft.CodeAnalysis.CSharp 已经支持 .net core 了因此 .net core 下编译c#字符串已经没有任何问题了。按照下列步骤进行1、增加PreserveCompilationContext配置编辑你的csproj项目文件增加如下配置PropertyGroupPreserveCompilationContexttrue/PreserveCompilationContext/PropertyGroup
2、引用包编辑你的csproj项目文件增加如下配置 ItemGroupPackageReference IncludeMicrosoft.CodeAnalysis.CSharp Version2.11.0-beta1-final /PackageReference IncludeMicrosoft.Extensions.DependencyModel Version2.1.0 //ItemGroup
3、利用 DependencyContext 获取编译引用dllMetadataReference[] _ref DependencyContext.Default.CompileLibraries.First(cl cl.Name Microsoft.NETCore.App).ResolveReferencePaths().Select(asm MetadataReference.CreateFromFile(asm)).ToArray();
完整例子MetadataReference[] _ref DependencyContext.Default.CompileLibraries.First(cl cl.Name Microsoft.NETCore.App).ResolveReferencePaths().Select(asm MetadataReference.CreateFromFile(asm)).ToArray(); string testClass using System; namespace test{public class tes{public string unescape(string Text){ return Uri.UnescapeDataString(Text);} }}; var compilation CSharpCompilation.Create(Guid.NewGuid().ToString() .dll).WithOptions(new CSharpCompilationOptions(Microsoft.CodeAnalysis.OutputKind.DynamicallyLinkedLibrary,usings: null,optimizationLevel: OptimizationLevel.Debug, // TODOcheckOverflow: false, // TODOallowUnsafe: true, // TODOplatform: Platform.AnyCpu,warningLevel: 4,xmlReferenceResolver: null // dont support XML file references in interactive (permissions doc comment includes))).AddReferences(_ref )).AddSyntaxTrees(CSharpSyntaxTree.ParseText(testClass));var eResult compilation.Emit(test.dll);
引用test库按照上述例子的步骤进行操作成功生成test.dll文件我引用并测试它是否可执行。var t new test.tes();
var txt t.unescape(abcdefg);
一切OK恭喜你已经完美搞定.net core 下的动态编译c#。总结难点在于DependencyContext的引入很多人都是卡在这一步因为.net 目标编译时默认会选用 .net framework库那么你的dll可以生成但是没法引入到 .net core 项目中来注脚https://github.com/dotnet/roslyn/wiki ↩︎https://github.com/dotnet/roslyn ↩︎https://www.antlr.org/download.html ↩︎https://github.com/dotnet/roslyn/wiki/Scripting-API-Samples ↩︎