[IronPython] PrivateBindings fails to expose functions in internal classes, but not properties

Leo Carbajal desleo at gmail.com
Sun Jan 9 05:42:24 CET 2011


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 <desleo at 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 <desleo at 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.
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/ironpython-users/attachments/20110108/111a7af3/attachment.html>


More information about the Ironpython-users mailing list