<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一文看懂 C# 腳本

          共 2776字,需瀏覽 6分鐘

           ·

          2022-10-15 04:43



          前言

          有些情況下,需要在程序運(yùn)行期間動(dòng)態(tài)執(zhí)行C#代碼,比如,將某些經(jīng)常改變的算法保存在配置文件中,在運(yùn)行期間從配置文件中讀取并執(zhí)行運(yùn)算。這時(shí)可以使用C#腳本來完成這些工作。

          正文

          使用C#腳本需要引用庫Microsoft.CodeAnalysis.CSharp.Scripting,下面是一些示例:最基本的用法是計(jì)算算數(shù)表達(dá)式:
          Console.Write("測試基本算數(shù)表達(dá)式:(1+2)*3/4");
          var res = await CSharpScript.EvaluateAsync("(1+2)*3/4");
          Console.WriteLine(res);

          如果需要使用比較復(fù)雜的函數(shù),可以使用WithImports引入名稱空間:

          Console.WriteLine("測試Math函數(shù):Sqrt(2)");
          res = await CSharpScript.EvaluateAsync("Sqrt(2)", ScriptOptions.Default.WithImports("System.Math"));
          Console.WriteLine(res);

          不僅是計(jì)算函數(shù),其它函數(shù)比如IO,也是可以的:

          Console.WriteLine(@"測試輸入輸出函數(shù):Directory.GetCurrentDirectory()");
          res = await CSharpScript.EvaluateAsync("Directory.GetCurrentDirectory()",
               ScriptOptions.Default.WithImports("System.IO"));
          Console.WriteLine(res);

          字符串函數(shù)可以直接調(diào)用:

          Console.WriteLine(@"測試字符串函數(shù):""Hello"".Length");
          res = await CSharpScript.EvaluateAsync(@"""Hello"".Length");
          Console.WriteLine(res);

          如果需要傳遞變量,可以將類的實(shí)例作為上下文進(jìn)行傳遞,下面的例子中使用了Student類:

          Console.WriteLine(@"測試變量:");
          var student = new Student { Height = 1.75M, Weight = 75 };
          await CSharpScript.RunAsync("BMI=Weight/Height/Height", globals: student);
          Console.WriteLine(student.BMI);

          類Student:

          public class Student
          {
              public Decimal Height { getset; }
              public Decimal Weight { getset; }
              public Decimal BMI { getset; }
              public string Status { getset; } = string.Empty;
          }

          重復(fù)使用的腳本可以復(fù)用:

          Console.WriteLine(@"測試腳本編譯復(fù)用:");
          var scriptBMI = CSharpScript.Create<Decimal>("Weight/Height/Height", globalsType: typeof(Student));
          scriptBMI.Compile();

          Console.WriteLine((await scriptBMI.RunAsync(new Student { Height = 1.72M, Weight = 65 })).ReturnValue);

          在腳本中也可以定義函數(shù):

          Console.WriteLine(@"測試腳本中定義函數(shù):");
          string script1 = "decimal Bmi(decimal w,decimal h) { return w/h/h; } return Bmi(Weight,Height);";

          var result = await CSharpScript.EvaluateAsync<decimal>(script1, globals: student);
          Console.WriteLine(result);

          在腳本中也可以定義變量:

          Console.WriteLine(@"測試腳本中的變量:");
          var script =  CSharpScript.Create("int x=1;");
          script =  script.ContinueWith("int y=1;");
          script =  script.ContinueWith("return x+y;");
          Console.WriteLine((await script.RunAsync()).ReturnValue);

          完整的實(shí)例可以從github下載:https://github.com/zhenl/CSharpScriptDemo

          轉(zhuǎn)自:尋找無名的特質(zhì)

          鏈接:cnblogs.com/zhenl/p/15714453.html

          瀏覽 34
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  豆花视频无码 | 国产99久久九九精品无码免费 | 日本一级操逼视频 | 色六月婷婷 | 日本在残a视频观看视频 |