Multiple exports with MEF does some really heinous stuff -- why, and why is it allowed?

Posted by Dave on Stack Overflow See other posts from Stack Overflow or by Dave
Published on 2010-04-20T19:23:17Z Indexed on 2010/04/20 19:33 UTC
Read the original article Hit count: 245

Filed under:
|
|
|

I have an interesting situation where I need to do something like this:

[Export[typeof(ICandy1)]
[Export[typeof(ICandy2)]
public class Candy : ICandy2 { ... }

where

public interface ICandy1 { ... }
public interface ICandy2 : ICandy1 { ... }

I couldn't find any posts anywhere regarding using multiple [Export] attributes, so I figured, what the hell, might as well try it.

At first glance, it actually seemed to work. I have a couple of methods that call into both interfaces of a Candy instance, and it was fine.

However, as I started to test the app, I saw that the behavior wasn't right, and when looking at the Output window, I saw that I was getting tons of COMExceptions. I couldn't track down where they were all coming from, but they always occurred when a worker thread was sleeping. I figured that it had to be from the main thread, then, but didn't know how to debug this at all. Nothing should have been going on in the GUI, and I disabled my DispatchTimers just in case -- same thing.

Even more strange than the COMExceptions was the really, really erratic behavior when stepping through code. About 30% of the time, when I single stepped, it would pop out of the method, or it would single step over two lines of code! Totally weird stuff that I am not used to seeing.

The only thing that changed between working and non-working code was the introduction of MEF through my plugin loading code. So as a test, I changed my plugin assembly to only export one interface, and I hardcoded everything in the app that relied on the other (now not-implemented) interface. And now the COMExceptions are gone, and the weird debugging behavior is gone.

Is this something people here have seen before? If MEF is not expected to allow a class to Export multiple interfaces, then shouldn't a CompositionException get raised when composing the parts? Can anyone explain why MEF would cause these weird problems???

© Stack Overflow or respective owner

Related posts about MEF

Related posts about wpf