3

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

在 Codeplex Wiki 上,他们有以下示例。我稍微改了一下:

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 未处理
  来源="IronScheme"
  堆栈跟踪:
       在 IronScheme.Runtime.R6RS.Exceptions.Raise(对象 obj)
       在 IronScheme.Runtime.R6RS.Exceptions.RaiseContinueable(对象 obj)
       在 IronScheme.Runtime.Builtins.UndefinedError(对象 sym)
       在 IronScheme.IronSchemeLanguageContext.MissingName(SymbolId 名称)
       在 Microsoft.Scripting.ModuleGlobalWrapper.GetCachedValue()
       在 Microsoft.Scripting.ModuleGlobalWrapper.get_CurrentValue()
       在 hello.Initialize(CodeContext)
       在 Microsoft.Scripting.ScriptCode.Run(CodeContext codeContext, Boolean tryEvaluate)
       在 Microsoft.Scripting.ScriptModule.Execute()
       在 Microsoft.Scripting.Hosting.ScriptEngine.ExecuteFile(字符串路径)
       在 D:\VSProjects\ExEdit\Infra.cs:line 35 中的 ExEdit.PluggerInner.RunSchemePlugin(String fileName)
       在 D:\VSProjects\ExEdit\Infra.cs:line 44 中的 ExEdit.PluggerInner.RunPlugins()
       在 D:\VSProjects\ExEdit\MainForm.cs:line 22 中的 ExEdit.MainForm.MainForm_Load(Object sender, EventArgs e)
       在 System.Windows.Forms.Form.OnLoad(EventArgs e)
       在 System.Windows.Forms.Form.OnCreateControl()
       在 System.Windows.Forms.Control.CreateControl(布尔 fIgnoreVisible)
       在 System.Windows.Forms.Control.CreateControl()
       在 System.Windows.Forms.Control.WmShowWindow(消息和 m)
       在 System.Windows.Forms.Control.WndProc(消息和 m)
       在 System.Windows.Forms.ScrollableControl.WndProc(消息和 m)
       在 System.Windows.Forms.ContainerControl.WndProc(消息和 m)
       在 System.Windows.Forms.Form.WmShowWindow(消息和 m)
       在 System.Windows.Forms.Form.WndProc(消息和 m)
       在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(消息& m)
       在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(消息和 m)
       在 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam)
       在 System.Windows.Forms.SafeNativeMethods.ShowWindow(HandleRef hWnd,Int32 nCmdShow)
       在 System.Windows.Forms.Control.SetVisibleCore(布尔值)
       在 System.Windows.Forms.Form.SetVisibleCore(布尔值)
       在 System.Windows.Forms.Control.set_Visible(布尔值)
       在 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 原因,ApplicationContext 上下文)
       在 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 原因,ApplicationContext 上下文)
       在 System.Windows.Forms.Application.Run(窗体 mainForm)
       在 D:\VSProjects\ExEdit\Program.cs:line 18 中的 ExEdit.Program.Main()
       在 System.AppDomain._nExecuteAssembly(程序集程序集,字符串 [] 参数)
       在 System.AppDomain.ExecuteAssembly(字符串 assemblyFile,证据 assemblySecurity,String [] args)
       在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       在 System.Threading.ThreadHelper.ThreadStart_Context(对象状态)
       在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态)
       在 System.Threading.ThreadHelper.ThreadStart()
  内部异常:

我的示例方案代码:

(define (test) (+ 1 1))

我不知道异常实际上在说什么,因为它没有 InnerException。

4

1 回答 1

5

我认为我没有ExecuteFile正确实施。

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

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

例子

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

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

于 2009-11-02T04:52:03.520 回答