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 (オブジェクト シンボリック) で
       IronScheme.IronSchemeLanguageContext.MissingName (SymbolId 名) で
       Microsoft.Scripting.ModuleGlobalWrapper.GetCachedValue() で
       Microsoft.Scripting.ModuleGlobalWrapper.get_CurrentValue() で
       hello.Initialize(CodeContext) で
       Microsoft.Scripting.ScriptCode.Run (CodeContext codeContext、ブール値の 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 (オブジェクト送信者、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、文字列 [] 引数) で
       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 に答える