我正在尝试向我的 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。