最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# 腳本引擎CS-Script的使用

 更新時間:2020年12月31日 09:23:02   作者:波多爾斯基  
這篇文章主要介紹了C#腳本引擎CS-Script的使用,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

最近想要在程序中嵌入一個C#腳本引擎,在.NET Framework時代用過一個叫做CS-Script的東西,感覺還是不錯,發(fā)現(xiàn)現(xiàn)在也支持.NET Core了,試著嵌入一下。

比較

要說能夠運行C#腳本的解決方案,有Roslyn和Mono,與他們相比,CS-Script能夠提供的封裝更為高級,它底層是通過Roslyn之類的引擎運行的,在此基礎(chǔ)上,提供了一些額外功能:

  • 執(zhí)行完整的C#文件
  • 通過外部進程執(zhí)行C#文件
  • 在運行過程中鏈接多個c#文件,并集成運行
  • 提供簡便的方法進行鏈接
  • 腳本調(diào)試功能

注:由于技術(shù)發(fā)展,很多功能可能已經(jīng)被Roslyn支持了。同時基于web有Try.NET和SharpLab等優(yōu)秀方案。

當(dāng)然也可以自己基于Roslyn去實現(xiàn)這些功能,不過CS-Script提供了更加簡單的封裝,適用于懶人。

使用

程序基于.NET 5的開發(fā),嘗試引用CS-Script包,發(fā)現(xiàn)不太好用,一直提示System.Reflection.TargetInvocationException:“Exception has been thrown by the target of an invocation.”。支持.NET Core的實際上是CS-Script.Core這個包,安裝即可。

Install-Package CS-Script.Core

CS-Script實際上底層支持Mono/Roslyn/CodeDom三種腳本引擎,由于.NET CORE的特殊性,CS-Script.Core做了刪減,只能支持Roslyn一種引擎了,支持的C#語言版本由Roslyn版本決定。

旁的不說,直接上代碼:

using CSScriptLib;
using System;
using System.Reflection;

namespace ConsoleApp3
{
  public class Program
  {
    static void Main(string[] args)
    {
      //var eval = CSScript.Evaluator.ReferenceAssemblyByNamespace("System.Text");
      //var p = eval.ReferenceAssemblyByNamespace("ConsoleApp3");
      Assembly compilemethod = CSScript.RoslynEvaluator.CompileMethod(
            @"using System;
             public static void CompileMethod(string greeting)
             {
               Console.WriteLine(""CompileMethod:"" + greeting);
             }");
      var p = compilemethod.GetType("css_root+DynamicClass");
      var me = p.GetMethod("CompileMethod");
      me.Invoke(null, new object[] { "1" });


      //eval = CSScript.Evaluator.ReferenceAssembly(sqr);
      dynamic loadmethod = CSScript.Evaluator.LoadMethod(@"using System;
             public void LoadMethod(string greeting)
             {
               Console.WriteLine(""LoadMethod:"" +greeting);
             }");
      loadmethod.LoadMethod("Hello World!");


      dynamic loadcode = CSScript.Evaluator
       .LoadCode(@"using System;
using ConsoleApp31;
using System.Text;
public class ScriptCC
{
  public void LoadCode(string greeting)
  {
    Console.WriteLine(""LoadCode:"" + greeting);
  }
}");
      loadcode.LoadCode("111");

      var eval = CSScript.Evaluator.ReferenceDomainAssemblies(DomainAssemblies.AllStaticNonGAC);

      var ass = eval
 .CompileCode(@"using System;
public static class ScriptCCStatic
{
  public static void LoadCodeStatic(string greeting)
  {
    Console.WriteLine(""LoadCodeStatic:"" + greeting);
  }
}");
      var tp = eval.CreateDelegate(@"int Sqr(int a)
                        {
                          return a * a;
                        }");
      Console.WriteLine(tp(3));

      eval = eval.ReferenceDomainAssemblies(DomainAssemblies.AllStaticNonGAC);
      Assembly compilecode = eval
      .CompileCode(@"using System;
using ConsoleApp31;//含有這個namespace的文件包含在本項目中。
using System.Text;
using ConsoleApp3;
public class ScriptLC
{
  public void CompileCode(string greeting)
  {
    Console.WriteLine(""CompileCode:"" + greeting + Encoding.ASCII.IsBrowserDisplay);
    Program.Write();
    Test.Send();
  }
}");
      var ps = compilecode.GetType("css_root+ScriptLC");
      var obj = compilecode.CreateInstance("css_root+ScriptLC");
      var mes = ps.GetMethod("CompileCode");
      mes.Invoke(obj, new object[] { "1" });
      Console.WriteLine();

      //查看evaluator的引用程序集
      var ww = eval.GetReferencedAssemblies();
      foreach (var n in ww)
      {
        if (n.GetName().Name.Contains("System")) continue;
        if (n.GetName().Name.Contains("Microsoft")) continue;
        if (n.GetName().Name.Contains("CS")) continue;
        Console.WriteLine("AseemblyName: " + n.GetName());
        foreach (var wn in n.GetTypes())
        {
          Console.WriteLine("Types: " + wn.Name);
        }
      }
      Console.WriteLine();

      //查看當(dāng)前AppDomain加載的程序集
      foreach (var n in AppDomain.CurrentDomain.GetAssemblies())
      {
        if (n.GetName().Name.Contains("System")) continue;
        if (n.GetName().Name.Contains("Microsoft")) continue;
        if (n.GetName().Name.Contains("CS")) continue;
        Console.WriteLine("AseemblyName: " + n.GetName());
        foreach (var wn in n.GetTypes())
        {
          Console.WriteLine("Types: " + wn.Name);
        }
      }
      Console.ReadKey();
    }

    public static void Write()
    {
      Console.WriteLine("REFERENCE OK");
    }
  }
}

總結(jié)

使用CS-Script.Core的時候,所有加載/編譯的方法與類型都動態(tài)加入了CurrentAppDomain,可以在主程序中進行調(diào)用(注意using和using static)。通過Evaluator.ReferenceAssembly等函數(shù)添加引用,不支持引用其他動態(tài)編譯的代碼段。

可以一次性將當(dāng)前AppDomain的程序集引用加入Evaluator,但是一樣,只能調(diào)用在文件中定義的程序集,無法加載其他動態(tài)程序集,調(diào)用Evaluator.ReferenceDomainAssemblies(DomainAssemblies.All)將提示錯誤。

這個限制是Roslyn導(dǎo)致的,暫時無法解決。如果需要實現(xiàn)多個代碼段的互相調(diào)用,可以直接將代碼段進行拼接,或者將公用的代碼段存成文件,從文件中進行調(diào)用。

CompileMethod

編譯方法,并返回動態(tài)生成的程序集,方法被默認加載到DynamicClass類中,該Type完全限定名稱為css_root+DynamicClass,定義的靜態(tài)方法需要使用以下方式調(diào)用。

var p = compilemethod.GetType("css_root+DynamicClass");
var me = p.GetMethod("CompileMethod");
me.Invoke(null, new object[] { "1" });

LoadMethod

加載方法,并返回默認類(DynamicClass)的一個對象,通過定義返回對象為dynamic類型,可以直接調(diào)用實例方法。

loadmethod.LoadMethod("Hello World!");

LoadCode

加載類,并返回代碼段中的第一個類的實例,通過定義返回對象為dynamic類型,可以直接調(diào)用實例方法。

loadcode.LoadCode("111");

CompileCode

編譯類,并返回動態(tài)生成的程序集,定義的實例方法可以使用以下方式調(diào)用。

var ps = compilecode.GetType("css_root+ScriptLC");
var obj = compilecode.CreateInstance("css_root+ScriptLC");
var mes = ps.GetMethod("CompileCode");
mes.Invoke(obj, new object[] { "1" });
Console.WriteLine();

CreateDelegate

生成一個委托,同樣定義在DynamicClass中,可以直接調(diào)用。

var tp = eval.CreateDelegate(@"int Sqr(int a)
                  {
                    return a * a;
                  }");
Console.WriteLine(tp(3));

參考資料

附上直接通過Roslyn使用腳本的方法:Roslyn Scripting-API-Samples.md

以上就是C#腳本引擎CS-Script的使用的詳細內(nèi)容,更多關(guān)于C#腳本引擎CS-Script的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#如何通過匿名類直接使用訪問JSON數(shù)據(jù)詳解

    C#如何通過匿名類直接使用訪問JSON數(shù)據(jù)詳解

    這篇文章主要給大家介紹了關(guān)于C#如何通過匿名類直接使用訪問JSON數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起看看吧。
    2018-02-02
  • 關(guān)于C#反射 你需要知道的

    關(guān)于C#反射 你需要知道的

    這篇文章主要介紹了C#反射的相關(guān)知識,文中講解的非常詳細,代碼幫助大家更好的參考學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • 使用C#實現(xiàn)Windows組和用戶管理的示例代碼

    使用C#實現(xiàn)Windows組和用戶管理的示例代碼

    這篇文章主要介紹了使用C#實現(xiàn)Windows組和用戶管理的示例代碼,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-01-01
  • C#?多項目打包時如何將項目引用轉(zhuǎn)為包依賴(最新推薦)

    C#?多項目打包時如何將項目引用轉(zhuǎn)為包依賴(最新推薦)

    這篇文章主要介紹了C#多項目打包時如何將項目引用轉(zhuǎn)為包依賴,本文給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2025-04-04
  • C#連續(xù)任務(wù)Task.ContinueWith方法

    C#連續(xù)任務(wù)Task.ContinueWith方法

    這篇文章介紹了C#中的連續(xù)任務(wù)Task.ContinueWith方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • C# datagridview、datagrid、GridControl增加行號代碼解析

    C# datagridview、datagrid、GridControl增加行號代碼解析

    今天這篇文章小編就來給大家分享關(guān)于C# datagridview、datagrid、GridControl增加行號的介紹,主要包括WinForm中datagridview增加行號、WPF中datagrid增加行號、WPF dev控件GridControl增加行號三個內(nèi)容,感興趣等我小伙伴可以參考一下
    2021-10-10
  • C#導(dǎo)入導(dǎo)出EXCEL文件的代碼實例

    C#導(dǎo)入導(dǎo)出EXCEL文件的代碼實例

    這篇文章主要介紹了C#導(dǎo)入導(dǎo)出EXCEL文件代碼實例,代碼的流程和方法都很詳細,需要的朋友可以參考下
    2014-04-04
  • C#中的IDisposable模式用法詳解

    C#中的IDisposable模式用法詳解

    這篇文章主要介紹了C#中的IDisposable模式用法,講述了垃圾資源回收機制的實現(xiàn),并對比分析了Dispose()方法、~DisposableClass()析構(gòu)函數(shù)、虛方法Dispose(bool disposing)的原理,需要的朋友可以參考下
    2014-09-09
  • C#如何給新建的winform程序添加資源文件夾Resources

    C#如何給新建的winform程序添加資源文件夾Resources

    這篇文章主要介紹了C#如何給新建的winform程序添加資源文件夾Resources,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • C#6 null 條件運算符

    C#6 null 條件運算符

    本文主要對比C# 6 null運算符與老版本的不同,并且用代碼實例測試,發(fā)現(xiàn)新語法性能提高,語法簡化了。希望看到的同學(xué)對你有所幫助
    2016-07-07

最新評論

华安县| 苍梧县| 贵州省| 潞城市| 建德市| 若尔盖县| 临安市| 保山市| 汪清县| 古交市| 千阳县| 白城市| 东乌珠穆沁旗| 阿合奇县| 民和| 乌兰浩特市| 都江堰市| 科技| 衡东县| 阜南县| 酉阳| 景宁| 通河县| 梧州市| 小金县| 武功县| 嘉善县| 新竹县| 深水埗区| 澄城县| 老河口市| 久治县| 门头沟区| 南溪县| 宣恩县| 安平县| 海宁市| 吉林省| 靖安县| 罗平县| 临海市|