• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-341  評論-2670  文章-0  trackbacks-0
                依然是上一篇文章的程序,換了C#寫。

                在Vczh Free Script 2.0的接口里面,我力求讓C++和.NET兩種語言的接口都趨于一致。目前達到了這個目標,C#僅僅比C++多了兩個輔助函數。插件那一部分是相當難寫啊。Vczh Free Script 2.0的C++接口允許插件和腳本交替調用。腳本引擎是本地代碼,做到跟C#『交替調用』基本上是不可能的。上次看過一篇文章,在本地代碼中調用托管代碼,用了無窮多pin和com,于是我換了一種辦法:使用Vczh Free Script 2.0提供的接口,用托管C++重新實現了一次插件。所幸代碼不長,大概一千行左右吧。

                下面是Vczh Free Script 2.0在C#中的使用方法。這個程序讀入一個文件然后執行,返回結果或者輸出錯誤信息以及出錯所在行數周邊的代碼。
              1 using System;
              2 using System.Collections.Generic;
              3 using System.Linq;
              4 using System.Text;
              5 using freescript_clr;
              6 
              7 namespace FreeScript_CSharp
              8 {
              9     class VczhClass : FsClass
             10     {
             11         public VczhClass(FsPlugin Plugin)
             12             : base(Plugin, "interpreter_debug")
             13         {
             14         }
             15 
             16         public override FsePluginInvoke CallConstructor(int ClassID, FsObject[] Parameters, ref FsObject ErrorMessage, ref FsObject Result)
             17         {
             18             Console.WriteLine("VczhClass is creating");
             19             AddExternalMember(ClassID, "MethodA"0);
             20             AddExternalMember(ClassID, "MethodB"1);
             21             AddExternalMember(ClassID, "MethodC"2);
             22             return FsePluginInvoke.Success;
             23         }
             24 
             25         public override FsePluginInvoke CallMember(int ClassID, int MemberID, FsObject[] Parameters, ref FsObject ErrorMessage, ref FsObject Result)
             26         {
             27             switch (GetMemberID(MemberID))
             28             {
             29                 case 0:
             30                     Console.WriteLine("VczhClass::MethodA is invoking.");
             31                     break;
             32                 case 1:
             33                     Console.WriteLine("VczhClass::MethodB is invoking.");
             34                     break;
             35                 case 2:
             36                     Console.WriteLine("VczhClass::MethodC is invoking.");
             37                     break;
             38             }
             39             return FsePluginInvoke.Success;
             40         }
             41 
             42         public override void CallDestructor(int ClassID)
             43         {
             44             Console.WriteLine("VczhClass is destroying.");
             45         }
             46     }
             47 
             48     class VczhConsole : FsPlugin
             49     {
             50         private FsObject FWrite = null;
             51         private FsObject FWriteLine = null;
             52         private FsObject FRead = null;
             53         private FsObject FCollect = null;
             54         private VczhClass FVczhClass = null;
             55 
             56         public VczhConsole(FsEngine Engine, string CodePath)
             57             : base(Engine, "interpretor")
             58         {
             59             FWrite = Engine.CreateExternalResource();
             60             FWriteLine = Engine.CreateExternalResource();
             61             FRead = Engine.CreateExternalResource();
             62             FCollect = Engine.CreateExternalResource();
             63             FVczhClass = new VczhClass(this);
             64 
             65             GetEnvironment().SetFixedVariable("write", FWrite);
             66             GetEnvironment().SetFixedVariable("writeln", FWriteLine);
             67             GetEnvironment().SetFixedVariable("read", FRead);
             68             GetEnvironment().SetFixedVariable("collect", FCollect);
             69             GetEnvironment().SetFixedVariable("VczhClass", FVczhClass.GetCtor());
             70             GetEnvironment().SetFixedVariable("apppath", Engine.CreateString(CodePath));
             71             GetEnvironment().SetFixedVariable("vmpath", Engine.CreateString(System.AppDomain.CurrentDomain.BaseDirectory.ToString()));
             72         }
             73 
             74         public override FsePluginInvoke Invoke(int ID, FsObject[] Parameters, ref FsObject ErrorMessage, ref FsObject Result)
             75         {
             76             if (ID == FWrite.GetExternalID())
             77             {
             78                 foreach (FsObject Param in Parameters)
             79                 {
             80                     Console.Write(Param.GetReadableString());
             81                 }
             82                 return FsePluginInvoke.Success;
             83             }
             84             else if (ID == FWriteLine.GetExternalID())
             85             {
             86                 foreach (FsObject Param in Parameters)
             87                 {
             88                     Console.Write(Param.GetReadableString());
             89                 }
             90                 Console.WriteLine();
             91                 return FsePluginInvoke.Success;
             92             }
             93             else if (ID == FRead.GetExternalID())
             94             {
             95                 foreach (FsObject Param in Parameters)
             96                 {
             97                     Console.Write(Param.GetReadableString());
             98                 }
             99                 Result = GetOwnedEngine().CreateString(Console.ReadLine());
            100                 return FsePluginInvoke.Success;
            101             }
            102             else if (ID == FCollect.GetExternalID())
            103             {
            104                 GetOwnedEngine().CollectGarbage();
            105                 return FsePluginInvoke.Success;
            106             }
            107             else
            108             {
            109                 return FsePluginInvoke.GiveUp;
            110             }
            111         }
            112     }
            113 
            114     class Program
            115     {
            116         static void Main(string[] args)
            117         {
            118             string AppPath = System.AppDomain.CurrentDomain.BaseDirectory.ToString();
            119             string CodePath = "";
            120             if (args.Length == 0)
            121             {
            122                 CodePath = AppPath + "Default.free";
            123             }
            124             else
            125             {
            126                 CodePath = args[0];
            127                 AppPath = System.IO.Path.GetDirectoryName(CodePath);
            128             }
            129             if (AppPath[AppPath.Length - 1!= '\\')
            130             {
            131                 AppPath += "\\";
            132             }
            133             string Code = (new System.IO.StreamReader(CodePath,Encoding.Default)).ReadToEnd();
            134             FsEngine Engine = new FsEngine(false);
            135             new VczhConsole(Engine, AppPath);
            136 
            137             string ErrorMessage = "";
            138             FsCodePage CodePage = Engine.Compile(Code,ref ErrorMessage);
            139             if (CodePage!=null)
            140             {
            141                 Engine.CreateTask(CodePage);
            142                 FsObject Result = Engine.CreateNull();
            143 
            144                 switch (Engine.Run(ref Result, ref ErrorMessage, false))
            145                 {
            146                     case FseRuntimeStatus.Exception:
            147                         {
            148                             Console.WriteLine("異常:[第" + (Engine.RuntimeErrorLine() + 1).ToString() + "行]" + Engine.RuntimeErrorMessage());
            149                             string[] Lines = Engine.RuntimeErrorCode().Split(new string[] { "\r\n" }, StringSplitOptions.None);
            150                             Console.WriteLine("==============================");
            151                             for (int i = Engine.RuntimeErrorLine() - 5; i <= Engine.RuntimeErrorLine() + 5; i++)
            152                             {
            153                                 if (i >= 0 && i < Lines.Length)
            154                                 {
            155                                     if (i == Engine.RuntimeErrorLine())
            156                                     {
            157                                         Console.Write("");
            158                                     }
            159                                     else
            160                                     {
            161                                         Console.Write("");
            162                                     }
            163                                     Console.WriteLine(Lines[i]);
            164                                 }
            165                             }
            166                             Console.WriteLine("==============================");
            167                         }
            168                         break;
            169                     case FseRuntimeStatus.Finish:
            170                         break;
            171                     default:
            172                         Console.WriteLine("未知錯誤。");
            173                         Engine.DestroyTask(Engine.GetTaskCount());
            174                         break;
            175                 }
            176             }
            177             else
            178             {
            179                 Console.WriteLine(ErrorMessage);
            180             }
            181             Console.ReadLine();
            182         }
            183     }
            184 }
            posted on 2008-05-29 19:57 陳梓瀚(vczh) 閱讀(2245) 評論(5)  編輯 收藏 引用 所屬分類: Vczh Free Script

            評論:
            # re: Vczh Free Script 2.0 最新.NET接口完成! 2008-05-29 20:34 | foxtail
            最近更新速度很快啊  回復  更多評論
              
            # re: Vczh Free Script 2.0 最新.NET接口完成! 2008-06-20 20:25 | Vampire.Kiss
            /cy BUG漫天爬  回復  更多評論
              
            # re: Vczh Free Script 2.0 最新.NET接口完成! 2008-06-21 00:28 | 陳梓瀚(vczh)
            VK啊等期末考后我給你最新版吧。上次給你的那個東西的確有很多Bug。嘿嘿。  回復  更多評論
              
            # re: Vczh Free Script 2.0 最新.NET接口完成! 2008-06-30 03:33 | suxiaojack
            Vczh Free Script 2.0 幾時有完整源碼放出?  回復  更多評論
              
            # re: Vczh Free Script 2.0 最新.NET接口完成! 2008-06-30 10:21 | 陳梓瀚(vczh)
            過幾天就有了。  回復  更多評論
              
            久久噜噜电影你懂的| 久久99国产乱子伦精品免费| 久久人妻无码中文字幕| 久久久久久精品免费看SSS| 久久亚洲精品中文字幕| 久久93精品国产91久久综合| 久久亚洲熟女cc98cm| 九九久久精品国产| 97精品伊人久久大香线蕉| 久久精品人人做人人妻人人玩| 国内精品久久久久久久涩爱 | 亚洲欧美精品伊人久久| 99久久国产宗和精品1上映| 国产精品久久网| 久久天天躁狠狠躁夜夜2020一| 曰曰摸天天摸人人看久久久| 精品久久久久久中文字幕大豆网| 久久国产精品99久久久久久老狼| 欧美精品九九99久久在观看| 中文成人无码精品久久久不卡| 国产亚洲欧美成人久久片| 久久精品国产亚洲AV蜜臀色欲| 国产午夜福利精品久久| 国内精品久久久久久久97牛牛| 香港aa三级久久三级老师2021国产三级精品三级在| 久久人人爽人人爽人人片av麻烦| 久久电影网| 伊人久久大香线蕉精品| 久久91精品国产91久久户| 久久成人国产精品| 热re99久久精品国99热| 久久精品无码一区二区WWW| 亚洲国产日韩欧美综合久久| 亚洲欧美成人久久综合中文网 | 日本道色综合久久影院| 久久久久久人妻无码| 久久久婷婷五月亚洲97号色| 欧洲成人午夜精品无码区久久| 精品国产99久久久久久麻豆| 久久精品国产色蜜蜜麻豆| 久久久久久精品成人免费图片|