I am building a console application that uses a MSH style CmdParser (
Shows | Microsoft Learn) 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