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 がないため、例外が実際に何について話しているのかわかりません。