[Ironruby-core] Reflection bug?

andrew Wilson a.wilson82 at gmail.com
Sat Jan 9 18:24:43 EST 2010


I am building a console application that uses a MSH style CmdParser (
http://channel9.msdn.com/playground/Sandbox/52952/) to read input parameters
and reflect match them up against a data class defining their meaning.

In the attempt to use RSpec & IronRuby to test my .net application, the code
blows up on a call to the below method:

private static Parameter[] GetPublicReadWriteCmdMembers(object instance)
        {
            if ( instance == null )
                throw new ArgumentNullException("instance");

            ArrayList al = new ArrayList();
            Type type = instance.GetType();
            ArrayList members = new ArrayList();
            members.AddRange(type.GetProperties());
            members.AddRange(type.GetFields());

            if ( members.Count == 0 )
                throw new ArgumentException("No public members in type.");

            foreach(MemberInfo mi in members)
            {
                // Only add members that have ParameterBaseAttribute(s).
                if ( ! mi.IsDefined(typeof(ParameterBaseAttribute), true) )
                    continue;

                switch(mi.MemberType)
                {
                    case MemberTypes.Property:
                        PropertyInfo pi = (PropertyInfo)mi;
                        if ( ! (pi.PropertyType.IsPublic && pi.CanRead &&
pi.CanWrite) )
                            throw new ArgumentException("All CMD members
must be public readable and writeable.");

                        // Loop here on members if parameterAttributes.
                        object[] pArray =
pi.GetCustomAttributes(typeof(ParameterAttribute), true);
                        if ( pArray != null && pArray.Length > 0 )
                        {
                            foreach(ParameterAttribute pa in pArray)
                            {
                                Parameter p =
Parameter.CreateParameter(instance, mi, pa);
                                al.Add(p);
                            }
                        }
                        else
                        {
                            // Use default ParameterAttribute.
                            ParameterAttribute pa = new
ParameterAttribute();
                            Parameter p =
Parameter.CreateParameter(instance, mi, pa);
                            al.Add(p);
                        }
                        break;
                    case MemberTypes.Field:
                        FieldInfo fi = (FieldInfo)mi;
                        if ( ! fi.FieldType.IsPublic )
                            throw new ArgumentException("All Cmd members
must be public");

                        object[] pArray2 =
fi.GetCustomAttributes(typeof(ParameterAttribute), true);
                        if ( pArray2 != null && pArray2.Length > 0 )
                        {
                            foreach(ParameterAttribute pa in pArray2)
                            {
                                Parameter p =
Parameter.CreateParameter(instance, mi, pa);
                                al.Add(p);
                            }
                        }
                        else
                        {
                            // Use default ParameterAttribute.
                            ParameterAttribute pa = new
ParameterAttribute();
                            Parameter p =
Parameter.CreateParameter(instance, mi, pa);
                            al.Add(p);
                        }

                        break;
                    default:
                        break;
                }
            }
            return (Parameter[])al.ToArray(typeof(Parameter));
        }

Specifically, the exception thrown is on the call: if ( !
mi.IsDefined(typeof(ParameterBaseAttribute), true) ) which is using
reflection to figure out if the input parameter is defined in my data class
(as best I can tell).

The exception is:

Could not load file or assembly 'CmdParser, Version=1.5.0.0,
Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system
cannot find the file specified.

So.  I am stuck at a bit of an impasse.  I tried requiring the CmdParser
assembly in the way it claims above and it indeed blows up.  However, if I
call require.the dll itself and do some testing in IR I can repeat the
exception during the reflection call.

Any ideas for how I might get through this?

-Andrew

-- 
When I wrote this, only God and I understood what I was doing.  Now, God
only knows - Karl Weierstrass
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://rubyforge.org/pipermail/ironruby-core/attachments/20100109/e8f7b63e/attachment.html>


More information about the Ironruby-core mailing list