例如,在Lua中,您可以将以下行放在脚本的末尾:
return <some-value/object>
然后托管应用程序可以检索返回的值/对象。
我使用此模式,以便脚本可以代表事件处理程序的工厂。然后使用基于脚本的事件处理程序来扩展应用程序。例如,托管应用程序运行一个名为“SomeEventHandler.lua”的脚本,该脚本定义并返回一个对象,该对象是应用程序中“SomeEvent”的事件处理程序。
这可以在Python中完成吗?或者有更好的方法来实现这一目标吗?
更具体地说,我在我的C#应用程序中嵌入了IronPython,并且正在寻找一种方法来实例化这些基于脚本的事件处理程序,这将允许使用Python扩展应用程序。
答案 0 :(得分:3)
这可以用Python完成同样的方式。您可以要求插件提供返回事件处理程序的getHandler()函数/方法:
class myPlugin(object):
def doIt(self,event,*args):
print "Doing important stuff"
def getHandler(self,document):
print "Initializing plugin"
self._doc = document
return doIt
当用户说“我想立即使用插件X”时,您知道要调用哪个函数。如果插件不仅要在直接命令之后调用,而且还要在某些事件(例如加载图形元素)之后调用,您还可以为插件作者提供将处理程序绑定到此事件的可能性。
答案 1 :(得分:2)
嵌入Python时完全有可能并且是一种常用技术。 This article显示了基础知识,this page也是如此。核心函数是PyObject_CallObject()
,它调用C语言编写的代码。
答案 2 :(得分:2)
请参阅Embedding the Dynamic Language Runtime中的一些示例。
一个简单的例子,setting-and-fetching-variables:
SourceCodeKind st = SourceCodeKind.Statements;
string source = "print 'Hello World'";
script = eng.CreateScriptSourceFromString(source, st);
scope = eng.CreateScope();
script.Execute(scope);
// The namespace holds the variables that the code creates in the process of executing it.
int value = 3;
scope.SetVariable("name", value);
script.Execute(scope);
int result = scope.GetVariable<int>("name");
答案 3 :(得分:1)
我这样做的方式(以及我看到它完成的方式)是为每个事件都有一个函数,所有事件都打包到一个模块中(或者几个,无关紧要),然后通过C调用函数/ C ++ / C#并使用其返回值。