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