I have an application that passes a DynamicObject to an IronPython script. The class works perfectly in C# but when a method is invoked inside a IronPython script the TryGetMember is called instead of TryInvokeMember and if I try to return a value through TryGetMember I get an exception saying that the member is not callable.
I found a user with similar problem ( http://social.msdn.microsoft.com/Forums/en/dlr/thread/0556e593-2360-43b8-97e5-201c3c3ce1c5). He said that dowloading the latest release solved the problem. I have downloaded the latest source code release (70538), compiled it to .NET 4.0, but I still having the issue. Here is a slightly modified code I get from the post, that does not work for me: using System; using System.Collections.Generic; using System.Linq; using System.Text; using IronPython.Hosting; using IronPython.Runtime; using Microsoft.Scripting; using Microsoft.Scripting.Hosting; using System.Dynamic; namespace TestDynamicInvokeFromPython { class Program { static void Main(string[] args) { dynamic myDynamicObject = new MyDynamicObject(); //first tey calling this object from C#, it should call Foo() and they try to call MissingMethod(); Console.WriteLine("C# Test..."); try { myDynamicObject.Foo(); System.Console.WriteLine("Method Result: " + myDynamicObject.MissingMethod()); } catch (Exception ex) { Console.WriteLine("Got C# exception: " + ex.Message); } ScriptEngine pythonEngine = Python.CreateEngine(); ScriptScope scriptScope = pythonEngine.CreateScope(); string pythonScript = SetPythonScript(); ScriptSource script = pythonEngine.CreateScriptSourceFromString(pythonScript, SourceCodeKind .Statements); scriptScope.SetVariable("myDynamicObject", myDynamicObject); //Now do the same thing from python, I expect to get the same behaviour as from C# (but I don't) Console.WriteLine("\r\nScript Test..."); try { script.Execute(scriptScope); } catch (Exception ex) { Console.WriteLine("Got script exception: " + ex.Message); } Console.ReadKey(); } static string SetPythonScript() { string s = ""; s += "import clr" + "\r\n"; s += "clr.AddReference('mscorlib')" + "\r\n"; s += "myDynamicObject.Foo();" + "\r\n"; s += "myDynamicObject.MissingMethod();" + "\r\n"; return s; } } public class MyDynamicObject : DynamicObject { public void Foo() { Console.WriteLine("Foo() Called"); } public override DynamicMetaObject GetMetaObject(System.Linq.Expressions. Expression parameter) { Console.WriteLine("GetMetaObject() Called"); return base.GetMetaObject(parameter); } public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) { if (binder.Name == "MissingMethod") { result = "Method Found"; return true; } else { result = null; return false; } } public override bool TryGetMember(GetMemberBinder binder, out object result) { Console.WriteLine("TryGetMember() Called"); return base.TryGetMember(binder, out result); } //#region AllOtherOverridees // ... //#endregion //AllOtherOverridees } } Marcus Carvalho
_______________________________________________ Users mailing list [email protected] http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
