marc_s
marc_s

Reputation: 754388

Running into trouble with MEF

I'm trying to create an extensible "utility" console application in .NET 4, and I figured using MEF to do this would give me the best in terms of flexibility and extensibility.

So I started setting up a MEF interface:

public interface IUtility
{
    string Title { get; }
    string Version { get; }

    void Execute(UtilContext context);
}

And then I created two nearly identical test plugins - just to see how this stuff works:

MEF Plugin:

[Export(typeof(IUtility))]
public class Utility1 : IUtility
{
    public string Title
    {
        get { return "Utility 1"; }
    }

    public string Version
    {
        get { return "1.0.0.0"; }
    }

    public void Execute(UtilContext context)
    {
    }
}

The console app that acts as the "host" for the MEF plugins looks something like this:

[ImportMany]
public IEnumerable<IUtility> _utilities { get; set; }

public void SetupMEF()
{ 
   string directory = ConfigurationManager.AppSettings["Path"];

   AggregateCatalog catalog = new AggregateCatalog();
   catalog.Catalogs.Add(new DirectoryCatalog(directory));

   CompositionContainer container = new CompositionContainer(catalog);
   container.ComposeParts(this);
}

I checked - the directory is being read from the app.config correctly, and the plugin modules (*.dll files) are present there after solution has been built. Everything seems just fine..... until I get this exception:

System.Reflection.ReflectionTypeLoadException was unhandled
Message = Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.

LoaderException:
Method 'get_Version' in type 'Utility.Utility1' from assembly 'Utility1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation

Hmmm.... what exactly is MEF trying to tell me here? And how do I fix this problem? Any thoughts, ideas, pointers?

Did I break some convention by having a property called Version of my own? Is that something reserved by MEF?

Upvotes: 0

Views: 1177

Answers (1)

marc_s
marc_s

Reputation: 754388

Sorry guys - my bad. There was a very old *.dll lingering around in the "plugin" directory that indeed did not have any implementation for that property's Get method.

Wiping out that pre-alpha ;-) *.dll solved my problem. I can indeed load my plugins now, and they can have a property called Version without any problems.

Upvotes: 2

Related Questions