gpt4 book ai didi

c# - 在 C# 应用程序中嵌入 IronScheme

转载 作者:行者123 更新时间:2023-11-30 15:12:12 25 4
gpt4 key购买 nike

我正在尝试向我的 C# 应用程序添加插件架构。我选择了IronScheme作为语言,还因为它建立在 DLR 之上,这应该更容易嵌入。

在 Codeplex Wiki 上,他们有 following example .我稍微改变了一下:

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: 

My example Scheme code:

(define (test) (+ 1 1))

我不知道异常实际上在说什么,因为它没有 InnerException。

最佳答案

我认为我没有正确实现 ExecuteFile

最简单的方法就是捕获 load 过程。

还有扩展方法,让生活更轻松。

例子

using IronScheme; // for extension methods
...
Callable load = "load".Eval<Callable>();
...
load.Call("myfile.ss");

我更新了异常处理以提供更好的错误消息(我希望如此!)。

关于c# - 在 C# 应用程序中嵌入 IronScheme,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1547763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com