Я пытаюсь добавить архитектуру плагинов в мое приложение 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 was unhandled
Source="IronScheme"
StackTrace:
at IronScheme.Runtime.R6RS.Exceptions.Raise(Object obj)
at IronScheme.Runtime.R6RS.Exceptions.RaiseContinueable(Object obj)
at IronScheme.Runtime.Builtins.UndefinedError(Object sym)
at IronScheme.IronSchemeLanguageContext.MissingName(SymbolId name)
at Microsoft.Scripting.ModuleGlobalWrapper.GetCachedValue()
at Microsoft.Scripting.ModuleGlobalWrapper.get_CurrentValue()
at hello.Initialize(CodeContext )
at Microsoft.Scripting.ScriptCode.Run(CodeContext codeContext, Boolean tryEvaluate)
at Microsoft.Scripting.ScriptModule.Execute()
at Microsoft.Scripting.Hosting.ScriptEngine.ExecuteFile(String path)
at ExEdit.PluggerInner.RunSchemePlugin(String fileName) in D:\VSProjects\ExEdit\Infra.cs:line 35
at ExEdit.PluggerInner.RunPlugins() in D:\VSProjects\ExEdit\Infra.cs:line 44
at ExEdit.MainForm.MainForm_Load(Object sender, EventArgs e) in D:\VSProjects\ExEdit\MainForm.cs:line 22
at System.Windows.Forms.Form.OnLoad(EventArgs e)
at System.Windows.Forms.Form.OnCreateControl()
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.WmShowWindow(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ContainerControl.WndProc(Message& m)
at System.Windows.Forms.Form.WmShowWindow(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.SafeNativeMethods.ShowWindow(HandleRef hWnd, Int32 nCmdShow)
at System.Windows.Forms.Control.SetVisibleCore(Boolean value)
at System.Windows.Forms.Form.SetVisibleCore(Boolean value)
at System.Windows.Forms.Control.set_Visible(Boolean value)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at ExEdit.Program.Main() in D:\VSProjects\ExEdit\Program.cs:line 18
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
Мой пример кода схемы:
(define (test) (+ 1 1))
Я понятия не имею, о чем на самом деле идет речь об исключении, поскольку у него нет InnerException.