代码之家  ›  专栏  ›  技术社区  ›  Lucas Jones

在C应用程序中嵌入IronScheme

  •  3
  • Lucas Jones  · 技术社区  · 15 年前

    我正在尝试将插件架构添加到我的C应用程序中。我选择了 IronScheme 作为语言,也因为它是建立在DLR之上的,这应该使它更容易嵌入。

    在codeplex wiki上,他们有 following example . 我稍微改变了一下:

    public class PluggerInner
    {
        IScriptEngine scheme;
    
        public PluggerInner()
        {
            InitScheme();
        }
    
        private void InitScheme()
        {
            var domMgr = ScriptDomainManager.CurrentManager;
            var schemePrv = new IronSchemeLanguageProvider(domMgr);
    
            scheme = schemePrv.GetEngine();
        }
    
        public void RunSchemePlugin(string fileName)
        {
            scheme.ExecuteFile(fileName);
        }
    
        public void RunPlugins()
        {
            foreach (var fl in new DirectoryInfo("../../plugins").GetFiles())
            {
                if (fl.Extension == ".ss")
                {
                    RunSchemePlugin(fl.FullName);
                }
            }
        }
    }
    

    (这基本上是作为 new PluggerInner().RunPlugins() )

    它找到了我的例子 .ss 目录中的文件(是的,我知道我不应该使用 ../.. ,但抛出一个 大量的 此行出错:

    scheme.ExecuteFile(fileName);
    

    我得到的例外情况是:

    IronScheme.Runtime.R6RS.CompoundCondition was unhandled
      Source="IronScheme"
      StackTrace:
           at IronScheme.Runtime.R6RS.Exceptions.Raise(Object obj)
           at IronScheme.Runtime.R6RS.Exceptions.RaiseContinueable(Object obj)
           at IronScheme.Runtime.Builtins.UndefinedError(Object sym)
           at IronScheme.IronSchemeLanguageContext.MissingName(SymbolId name)
           at Microsoft.Scripting.ModuleGlobalWrapper.GetCachedValue()
           at Microsoft.Scripting.ModuleGlobalWrapper.get_CurrentValue()
           at hello.Initialize(CodeContext )
           at Microsoft.Scripting.ScriptCode.Run(CodeContext codeContext, Boolean tryEvaluate)
           at Microsoft.Scripting.ScriptModule.Execute()
           at Microsoft.Scripting.Hosting.ScriptEngine.ExecuteFile(String path)
           at ExEdit.PluggerInner.RunSchemePlugin(String fileName) in D:\VSProjects\ExEdit\Infra.cs:line 35
           at ExEdit.PluggerInner.RunPlugins() in D:\VSProjects\ExEdit\Infra.cs:line 44
           at ExEdit.MainForm.MainForm_Load(Object sender, EventArgs e) in D:\VSProjects\ExEdit\MainForm.cs:line 22
           at System.Windows.Forms.Form.OnLoad(EventArgs e)
           at System.Windows.Forms.Form.OnCreateControl()
           at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
           at System.Windows.Forms.Control.CreateControl()
           at System.Windows.Forms.Control.WmShowWindow(Message& m)
           at System.Windows.Forms.Control.WndProc(Message& m)
           at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
           at System.Windows.Forms.ContainerControl.WndProc(Message& m)
           at System.Windows.Forms.Form.WmShowWindow(Message& m)
           at System.Windows.Forms.Form.WndProc(Message& m)
           at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
           at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
           at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
           at System.Windows.Forms.SafeNativeMethods.ShowWindow(HandleRef hWnd, Int32 nCmdShow)
           at System.Windows.Forms.Control.SetVisibleCore(Boolean value)
           at System.Windows.Forms.Form.SetVisibleCore(Boolean value)
           at System.Windows.Forms.Control.set_Visible(Boolean value)
           at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
           at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
           at System.Windows.Forms.Application.Run(Form mainForm)
           at ExEdit.Program.Main() in D:\VSProjects\ExEdit\Program.cs:line 18
           at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
           at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
           at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
           at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
           at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           at System.Threading.ThreadHelper.ThreadStart()
      InnerException: 
    

    我的示例方案代码:

    (define (test) (+ 1 1))
    

    我不知道这个例外实际上在说什么,因为它没有内在感受。

    1 回复  |  直到 15 年前
        1
  •  5
  •   leppie    15 年前

    我不认为我实现了 ExecuteFile 正确地。

    最简单的就是抓住 load 程序。

    还有扩展方法,让生活更轻松。

    例子

    using IronScheme; // for extension methods
    ...
    Callable load = "load".Eval<Callable>();
    ...
    load.Call("myfile.ss");
    

    我已经更新了异常处理以提供更好的错误消息(我希望!).