大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
Roslyn 是微软公司开源的 .NET 编译器。编译器支持 C# 和 Visual Basic 代码编译,并提供丰富的代码分析 API。
GITHUB地址:https://github.com/dotnet/roslyn.git
Roslyn在vs2013上通过在 Manage NuGet Packages 中下载安装Microsoft.CodeAnalysis、Microsoft.CodeAnalysis.CSharp、Microsoft.CodeAnalysis.VisualBasic组件以后,
便可以在C#项目和VB项目中使用Roslyn的API。
下面是一段使用Roslyn API编写的C#编译器。
public class CSharpScriptEngine
{
private static Script _previousInput;
private static Lazy<object> _nextInputState = new Lazy<object>();
private static ScriptOptions _options;
public static void AddReferenceAndNameSpace(string[] assemblys,string[] namespaces)
{
ScriptOptions _option = ScriptOptions.Default;
if (assemblys != null && assemblys.Length > 0)
{
foreach (string item in assemblys)
{
var type = Type.GetType(item);
if (type == null)
{
type = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(obj => obj.GetType(item) != null).GetType(item);
}
_option=_option.AddReferences(Assembly.GetAssembly(type));
}
}
if (namespaces != null && namespaces.Length > 0)
{
_option=_option.AddNamespaces(namespaces);
}
_options = _option;
}
public static object Execute(string code)
{
var script = CSharpScript.Create(code, ScriptOptions.Default).WithPrevious(_previousInput).WithOptions(_options);
var endState = script.Run(_nextInputState.Value);
_previousInput = endState.Script;
_nextInputState = new Lazy<object>(() => endState);
return endState.ReturnValue;
}
}
通过调用CSharpScriptEngine中的Execute方法来实现在项目的代码实现期动态的编译我们输入的C#代码,
编译后的代码似乎并不嵌入到原代码(编译以后)中,所以我们需要指定引入代码中需要的Assembly和Namespace,
AddReferenceAndNameSpace方法便是在做这件事。
下面写个简单的测试代码来测试上面的编译器是否可以正常工作。
public void TestCSharpScriptEngine()
{
string script = @"
PowerShellEngine.Invoke(""Get-Date"",null)
";
string[] assemblys = { "MyWebProjectService.CSharpScriptEngine", "System.Management.Automation.PSObject", "System.Collections.ObjectModel.Collection`1" };
string[] namespaces = { "MyWebProjectService" };
CSharpScriptEngine.AddReferenceAndNameSpace(assemblys,namespaces);
Collection<PSObject> result = (Collection<PSObject>)CSharpScriptEngine.Execute(script);
}
测试代码中我们动态给加入我们自己写的C#代码 “PowerShellEngine.Invoke(“”Get-Date””,null)” 调用PowerShellEngine
类的Invoke方法来执行一个Get-Date命令。
这里有篇文章比较详细的介绍了Roslyn API的各种用法:http://www.daveaglick.com/posts/compiler-platform-scripting
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/195777.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...