MEF plugin dependency not loading as plugins directory is not checked
Asked Answered
P

1

7

I'm having problems with MEF not picking up dependencies for loaded components. We have a directory structure that looks like:

C:/MSMQ/DistributionService/[Main application]

C:/MSMQ/Providers/[plugin components]

Of course, we are using a DirectoryCatalog, the plugin is picked up, but one of its' dependencies is not. The error message is:

2012-11-02 10:46:59,379 [1] FATAL - Assemblies required by Provider are not found
System.IO.FileNotFoundException: Could not load file or assembly 'BusinessObjects, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
File name: 'BusinessObjects, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null'

=== Pre-bind state information ===
LOG: User = <redacted>
LOG: DisplayName = BusinessObjects, Version=1.5.0.0, Culture=neutral, Public
KeyToken=null
 (Fully-specified)
LOG: Appbase = file:///C:/MSMQ/DistributionService/
LOG: Initial PrivatePath = NULL
Calling assembly : DistributedServicePropertyComponents, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\MSMQ\DistributionService\Distr
ibutionService.exe.Config
LOG: Using host configuration file:
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\
v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partia
l, or location-based assembly bind).
LOG: The same bind was seen before, and was failed with hr = 0x80070002.

2012-11-02 10:46:59,401 [1] FATAL - Assemblies required by Provider are not found
System.IO.FileNotFoundException: Could not load file or assembly 'BusinessObjects, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
File name: 'BusinessObjects, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null'

=== Pre-bind state information ===
LOG: User = B2B\addisona
LOG: DisplayName = BusinessObjects, Version=1.5.0.0, Culture=neutral, Public
KeyToken=null
 (Fully-specified)
LOG: Appbase = file:///C:/MSMQ/DistributionService/
LOG: Initial PrivatePath = NULL
Calling assembly : DistributedServicePropertyComponents, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\MSMQ\DistributionService\DistributionService.exe.Config
LOG: Using host configuration file:
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\
v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: The same bind was seen before, and was failed with hr = 0x80070002.

I believe this is similar to a question on MSDN: http://social.msdn.microsoft.com/Forums/en-US/MEFramework/thread/b34ef4f4-e1f1-4f06-bd42-d7b3d5060f6f/ - but I don't understand the answer.

Is there any way to provide a path to pick the problem assembly up from, or any other suggested solution?

We have only started having this problem recently, but I can't see any changes I'd expect to cause that in our source control history.

Pesticide answered 5/11, 2012 at 12:13 Comment(5)
Are you trying to load the assembly from signed (or delay signed) code?Leontine
as far as I am aware, signed code is not involved (except in the framework libraries).Pesticide
Then are you trying to load a 64bit assembly from 32bit code?Leontine
Hi penguat - did you get a resolution to this issue? I have the same problemForsooth
@PatrickHastings we bunged everything into one folder. It's not elegant, but it works.Pesticide
T
1

One or more of your plugins are dependent on the BusinessObjects assembly, while your host application does not reference this assembly. You can do either of the following to fix this:

  1. Add a reference to this assembly from your main application, so that the plugins can use it when they are loaded.
  2. Add this assembly to your C:\MSMQ\Providers directory, so that when the plugins are loaded and look for that assembly, they can find it and load it as well.
Transship answered 18/11, 2012 at 21:9 Comment(1)
This assembly is in the C:\MSMQ\Providers directory, and not being found.Pesticide

© 2022 - 2024 — McMap. All rights reserved.