我在一个Silverlight应用程序中托管IronPython脚本,我想运行该脚本并获取一个System.Windows.Controls.TextBlock对象。
所以我使用这个ironPython代码:
import clr
clr.AddReferenceByName("System.Windows.Controls, Version=2.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")
from System.Windows.Controls import *
tb = TextBlock()
我能够添加引用,但是,当我导入System.Windows.Controls时,我得到一个System.NotImplementedException。
如果我尝试使用“import wpf”
,也会发生同样的情况我正在使用Silverlight 4和IronPython 2.7.1 beta2 这是运行脚本的代码:
Dim engine = IronPython.Hosting.Python.CreateEngine
Dim scope = engine.CreateScope()
Dim source = engine.CreateScriptSourceFromString(CodeTB.Text)
source.Execute(scope)
ResultLB.Items.Add(scope.GetVariable("hello"))
If scope.ContainsVariable("tb") Then
GuiStack.Children.Add(scope.GetVariable("tb"))
End If
以下是异常的堆栈跟踪:
en Microsoft.Scripting.PlatformAdaptationLayer.FileExists(String path)
en IronPython.Runtime.Importer.LoadModuleFromSource(CodeContext context, String name, String path)
en IronPython.Runtime.Importer.LoadPackageFromSource(CodeContext context, String name, String path)
en IronPython.Runtime.Importer.LoadFromDisk(CodeContext context, String name, String fullName, String str)
en IronPython.Runtime.Importer.ImportFromPathHook(CodeContext context, String name, String fullName, List path, Func`5 defaultLoader)
en IronPython.Runtime.Importer.ImportFromPath(CodeContext context, String name, String fullName, List path)
en IronPython.Runtime.Importer.ImportTopAbsolute(CodeContext context, String name)
en IronPython.Runtime.Importer.ImportModule(CodeContext context, Object globals, String modName, Boolean bottom, Int32 level)
en IronPython.Modules.Builtin.__import__(CodeContext context, String name, Object globals, Object locals, Object fromlist, Int32 level)
en Microsoft.Scripting.Interpreter.FuncCallInstruction`7.Run(InterpretedFrame frame)
en Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
en Microsoft.Scripting.Interpreter.LightLambda.Run7[T0,T1,T2,T3,T4,T5,T6,TRet](T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6)
en IronPython.Runtime.Importer.ImportLightThrow(CodeContext context, String fullName, PythonTuple from, Int32 level)
en IronPython.Runtime.Importer.Import(CodeContext context, String fullName, PythonTuple from, Int32 level)
en IronPython.Runtime.Operations.PythonOps.ImportStar(CodeContext context, String fullName, Int32 level)
en Microsoft.Scripting.Interpreter.ActionCallInstruction`3.Run(InterpretedFrame frame)
en Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
en Microsoft.Scripting.Interpreter.LightLambda.Run2[T0,T1,TRet](T0 arg0, T1 arg1)
en IronPython.Compiler.PythonScriptCode.RunWorker(CodeContext ctx)
en IronPython.Compiler.PythonScriptCode.Run(Scope scope)
en IronPython.Compiler.RuntimeScriptCode.InvokeTarget(Scope scope)
en IronPython.Compiler.RuntimeScriptCode.Run(Scope scope)
en Microsoft.Scripting.SourceUnit.Execute(Scope scope, ErrorSink errorSink)
en Microsoft.Scripting.SourceUnit.Execute(Scope scope)
en Microsoft.Scripting.Hosting.ScriptSource.Execute(ScriptScope scope)
en TestApp2.MainPage.ExecuteButton_Click(Object sender, RoutedEventArgs e)
en System.Windows.Controls.Primitives.ButtonBase.OnClick()
en System.Windows.Controls.Button.OnClick()
en System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
en System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl, EventArgs e)
en MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)
以下是所有source code
谢谢你的一切:)
答案 0 :(得分:0)
它应该没有任何AddReference
:
import clr
from System.Windows.Controls import TextBlock
tb = TextBlock()
答案 1 :(得分:0)
谢谢你,卢卡斯,这篇文章非常有帮助,现在问题得到解决。 这是我的新源代码
Dim setup As ScriptRuntimeSetup = Python.CreateRuntimeSetup(Nothing)
setup.HostType = GetType(Microsoft.Scripting.Silverlight.BrowserScriptHost)
Dim runtime As New ScriptRuntime(setup)
Dim engine = IronPython.Hosting.Python.GetEngine(runtime)
Dim scope = engine.CreateScope()
Dim uri As New Uri("System.Windows.Controls.dll", UriKind.Relative)
Dim sri As StreamResourceInfo = Application.GetResourceStream(uri)
Dim ap As New AssemblyPart
Dim asm As Assembly = ap.Load(sri.Stream)
runtime.LoadAssembly(asm)
Dim assamblies As String() = {"mscorlib", "System", "System.Windows", "System.Windows.Browser", "System.Net"}
For Each item In assamblies
runtime.LoadAssembly(runtime.Host.PlatformAdaptationLayer.LoadAssembly(item))
Next
Dim source = engine.CreateScriptSourceFromString(CodeTB.Text, Microsoft.Scripting.SourceCodeKind.Statements)
source.Execute(scope)
ResultLB.Items.Add(scope.GetVariable("hello"))
If scope.ContainsVariable("tb") Then
GuiStack.Children.Add(scope.GetVariable("tb"))
End If