views:

565

answers:

3

I am working on a plugin system that loads .dll's contained in a specified folder. I am then using reflection to load the assemblies, iterate through the types they contain and identify any that implement my IPlugin interface.

I am checking this with code similar to the following:

foreach(Type t in myTypes )
{
    if( typeof(IPlugin).IsAssignableFrom(t) )
    {
       ...
    }
}

For some reason IsAssignableFrom() keeps returning false when it should be returning true. I have tried replacing the t by explicitely giving it a type that should pass, and it works fine, but for some reason it isn't working with the types that are returned from the loaded assembly. To make things stranger, the code works fine on my coworker's machine but not on mine.

Does anyone know of anything that might cause this sort of behavior?

Thanks

A: 

I work in Java which has the same API method and I just can't get my mind to grok it when reading the code (for some reason); therefore, I always read it in reverse as, in your case, "t is assignable to IPlugin). So if C# has "is" as Jonathon suggests, I would always use it - when reflecting in Java "instanceof" does not work for Class objects, only instances of the object.

Software Monkey
+3  A: 

That typically happens when there's a mismatch between the assembly which contains the type IPlugin that the current assembly references, and the assembly which is referenced by the assembly containg the types you're iterating over.

I suggest you print:

typeof (IPlugin).Module.FullyQualifiedName

and

foreach (var type in t.GetInterfaces ()) Console.WriteLine (type.Module.FullyQualifiedName)

To see where the mismatch is.

Jb Evain
A: 

Have you defined the interface in multiple places?

When you say that it works fine on your coworkers machine, do you mean that a compiled program works on his machine but not on yours, or that if he compiles it he works, but if you compile it it doesn't?

Lasse V. Karlsen