Thank you for poking around on this, I wouldn't have any idea where to even start.
Unfortunately, I can't figure out how to build 2.6.2 from source so I guess I'll have to wait for a bugfix. On Sun, Jan 9, 2011 at 7:57 AM, Richard Nienaber <rjniena...@gmail.com>wrote: > Thanks for providing the reproduction steps. I've had a look around the > source and it seems like the problem is happening somewhere between > CompilerHelpers.cs<https://github.com/IronLanguages/main/blob/master/Runtime/Microsoft.Dynamic/Generation/CompilerHelpers.cs#L368> > and > PythonBinder.cs<https://github.com/IronLanguages/main/blob/master/Languages/IronPython/IronPython/Runtime/Binding/PythonBinder.cs#L85>that > calls it. If > the interface is not visible, it tries to return it's base type which is > null. If I just return the interface out of the GetVisibleType method before > it hits null, the message is displayed as intended. > > It seems logic is needed to special case interfaces and/or handle the > PrivateBindings option but I don't know enough to say. > > Richard > > On Sun, Jan 9, 2011 at 4:42 AM, Leo Carbajal <des...@gmail.com> wrote: > >> Sorry to spam the list, but I did some more tracking on this and figured >> something out. I downgraded from 2.7b1 to 2.6.2 and my original example >> worked just fine in. I thought my woes were over, and then I ran into a >> similar problem in 2.6.2. It appears that IPy cannot cast an object to a >> different type, specifically an interface in 2.6.2, when the class is >> internal and you're working with PrivateBinding = true >> >> I logged it as http://ironpython.codeplex.com/workitem/29939 with the >> following example: >> >> internal interface IExample >> { >> string Message { get; set; } >> } >> >> internal class Avatar : IExample >> { >> public string Message { get; set;} >> >> public Avatar() >> { >> Message = "I am an avatar."; >> } >> >> public void Hello(Avatar avatar) >> { >> Console.WriteLine("From Hello: " + Message); >> } >> >> public void Hi(IExample avatar) >> { >> Console.WriteLine("From Hi: " + Message); >> } >> } >> >> Using the following python code: >> avatar = Avatar() >> avatar.Hello(avatar) >> avatar.Hi(avatar) >> >> avatar.Hello prints it's message as expected, but avatar.Hi fails with: >> System >> Error: object reference not set to instance of object. >> >> On Sat, Jan 8, 2011 at 6:07 PM, Leo Carbajal <des...@gmail.com> wrote: >> >>> Ok, here's a clarification. >>> >>> Say you have this class: >>> >>> internal class ZMPReporter : IReporter >>> { >>> public string Setting { get; set; } >>> >>> internal void Trixery(string mes, string mes1, string mes2, bool >>> thing) >>> { >>> Flash(mes, mes1, mes2, thing); >>> } >>> >>> public void Flash(string sender, string message, string >>> recipient, bool isAuthor) >>> { >>> ... >>> } >>> } >>> >>> It's a property of another class. In C# I would use it as follows: >>> caller.Reporter.Flash(..parameters..) >>> >>> If I call it in a normal IPy engine it fails to even recognize the caller >>> variable, which is fine and totally expected (and desired). In the >>> PrivateBinding scenario described I can call >>> >>> caller.Reporter.Setting and get the text data perfectly. When I try to >>> call caller.Reporter.Flash(), though, I get the System Error: object >>> reference not set problem. However, I can call >>> caller.Report._ZMPReporter__Trixery() just fine, which in turn calls Flash >>> for me. >>> >>> I don't mind using the name mangling overly, but I do mind having to make >>> internal proxies for perfectly good, already existing, functions. I can't >>> just make those methods internal because the IReporter interface demands >>> that they be public. If this was the only class that might give me problems >>> I might even look for a way around that, but the entire project uses >>> Interfaces extensively. >>> >>> On Sat, Jan 8, 2011 at 5:36 PM, Leo Carbajal <des...@gmail.com> wrote: >>> >>>> Hello all, >>>> >>>> Almost I thought I could have my cake and eat it too. I have a large >>>> client-server project written in C# that I wanted to be able to script with >>>> IronPython. The biggest requirement was that I wanted external admins to be >>>> able to provide scripts for the server to augment its functions. However, I >>>> don't want them to have full access to the server API so I resigned myself >>>> to write the project with everything Internal and then build public facing >>>> classes for the functionality I wanted to expose. This, I know, to work >>>> fine. >>>> >>>> however, I still want to be able to use scripts on the server myself, >>>> for other things. I ended up using two engines, one with PrivateBinding on >>>> and one without. The one with PrivateBinding set to true can see all >>>> private >>>> and internal members but whenever I try to call a function from IronPython >>>> I >>>> get an exception of "System Error: Object reference not set to an instance >>>> of an object." It's weird because I can call on properties and get their >>>> values, but not functions. If I do a dir() on the class, and the member, >>>> IronPython can clearly see what they are and that they exist. If it helps, >>>> the class i'm trying to access is internal but has all public members (for >>>> interfaces). >>>> >>>> I guess my question is whether this behavior is intentional or not. >>>> Being able to use my API on one engine for actual server work while >>>> providing a different one for plugin\event hook writers, would help >>>> tremendously. >>>> >>> >>> >> >> _______________________________________________ >> Users mailing list >> Users@lists.ironpython.com >> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com >> >> > > _______________________________________________ > Users mailing list > Users@lists.ironpython.com > http://lists.ironpython.com/listinfo.cgi/users-ironpython.com > >
_______________________________________________ Users mailing list Users@lists.ironpython.com http://lists.ironpython.com/listinfo.cgi/users-ironpython.com