|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
说句实话,Java跨平台根本就不是外行人想想的那种,一次编译,处处运行。跟着IronPyhon2.0的公布,.NETDynamicLanguageRuntime也加倍成熟了,在2.0中我们能够用静态剧本以粘合剂的体例编写架构系统中的各类逻辑单位,既便于修正,又能天真合适多变的营业场景。固然,我的方针是在PlatformFramework中能嵌进剧本引擎,而不是用ipy.exe往实行一个“自力”的义务。要让.net项目能真正跟剧本举行交互,还得必要供应剧本引擎的完成。这得提到DLR一些基础观点了。
下图摘自DLR匡助文件,经由过程它我们基础能够懂得基于DLR的构成体例。
下图形貌了DLR的基础实行流程。
ScriptRuntime:创立DLR运转情况,这是全部实行历程的肇端点,它暗示一个全局的实行形态(好比程序集援用等等)。每一个使用程序域(AppDomain)中能够启动多个ScriptRuntime。
ScriptScope:构建一个实行高低文,个中保留了情况及全局变量。宿主(Host)能够经由过程创立分歧的ScriptScope来供应多个数据断绝的实行高低文。
ScriptEngine:DLR静态言语(好比IronPython)实行类,可于剖析和实行静态言语代码。
ScriptSource:操控静态言语代码的范例,我们能够编译(Compile)、读取(ReadCodeLines)或运转(Execute)代码。
CompiledCode:挪用ScriptSource.Compile()将源代码编译成CompiledCode,如许屡次实行就无需反复编译,从而进步实行功能。
ObjectOperations:供应了相干办法,同意我们在宿主(Host)中操纵DLR工具成员(Member)。
如今我们来构建剧本引擎
固然我们必需到场IronPyhton供应的相干援用并导进定名空间
usingIronPython.Hosting;
usingIronPython.Compiler;
usingIronPython.Runtime;
usingMicrosoft.Scripting;
usingSystem.Runtime.Remoting;
1、HelloWorld
以下为援用的内容:
varpy=@"
deftest():
return‘helloworld~!’;
printtest();";
varengine=Python.CreateEngine();
varcode=engine.CreateScriptSourceFromString(py,SourceCodeKind.Statements);
code.Execute();
输入:helloworld~!
注重:Python关于源代码缩进的格局有严厉请求。
2、给Python高低文供应变量
varscope=engine.Runtime.Globals;//engine.Runtime.CreateScope();
scope.SetVariable(“x”,123);
3、读取Python高低文中的变量
varx=scope.GetVariable<int>(“x”);
能够看出ScriptScope能够在Host和ScriptRuntime间传送数据。
4、工具实例共享
以下为援用的内容:
varpy=@"
o.X=o.X+2;
printo.X;";
varengine=Python.CreateEngine();
varcode=engine.CreateScriptSourceFromString(py,SourceCodeKind.Statements);
varscope=engine.Runtime.Globals;
varo=newData{X=123};
scope.SetVariable("o",o);
code.Execute(scope);
Console.WriteLine(o.X);
载进程序集并由ScriptRuntime办理
5、创立程序集test.dll
以下为援用的内容:
namespaceMy.Library
{
publicclassMyClass
{
publicintTest(intx)
{
return++x;
}
}
}
创立Host程序
以下为援用的内容:
varpy=@"
importclr;
fromMy.LibraryimportMyClass;
fromSystemimportConsole;
o=MyClass();
x.X=o.Test(x.X);
Console.WriteLine(x.X);";
varengine=Python.CreateEngine();
engine.Runtime.LoadAssembly(Assembly.GetAssembly(typeof(int)));//mscorlib.dll
engine.Runtime.LoadAssembly(Assembly.LoadFrom("test.dll"));//test.dll
varcode=engine.CreateScriptSourceFromString(py,SourceCodeKind.Statements);
varscope=engine.Runtime.Globals;
varx=newData{X=123};
scope.SetVariable("x",x);
code.Execute(scope);
Console.WriteLine(x.X);
读取Python高低文工具实例属性
以下为援用的内容:
varpy=@"
classClass1:
def__init__(self):
self.i=100
definc(self):
self.i=self.i+100
o=Class1()";
varo=scope.GetVariable("o");
vari=engine.Operations.GetMember<int>(o,"i");
读取Python高低文工具实例办法
engine.Execute("o.inc()",scope);//已在高低文情况中实行此工具办法
如果需要重新编写代码,几乎任何一门计算机语言都可以跨平台了,还用得着Java嘛,而且像PHP/C#等语言不需要修改代码都可以跨Windows/Linux。 |
|