C# – WPF control throwing ‘resource identified by the URI missing’ exception

cwpf

On loading the plugin and trying to create 'XYZ' control, the application throws the following exception:

"The component 'XYZ' does not have a
resource identified by the URI
'/ThePluginAssembly;component/XYZ.xaml'"
on the InitializeComponent() method in
the UserControls constructor.

The key points are:

  1. The user control is located in the plugin assembly

  2. I am trying to create the usercontrol from inside the plugin assembly

  3. The plugins are located in the same directory as the main application

  4. The user controls only have problems when they are created through XAML. I have a couple of other usercontrols in the same assembly but I instantiate these using code. I only receive the error message when I attempt to create a UserControl in XAML.

On doing some google, i realized that this happens when two instances of my plugin are loaded in the application. When i removed my plugin from one of the folders ( I allow this plugin to be loaded from two locations) this exception stopped recurring.

My questions:

1) What is the reason behind WPF trying to resolve a URI to load my control?

2) Isn't there a way by which i could have two instances of my plugin loaded in the application and somehow get rid of this exception? or some way to create a unique URI for each instances (if this exception is caused by a conflicting URI).

Any comment or reference would be of help.

Thanks for your interest.

Edit:
Same problem as posted by Phil : How to force WPF to use resource URIs that use assembly strong name? Argh!

Best Answer

The only way to do this would be to include the version information in your URI, so the XAML loader can distinguish the correct type. This MSDN article explains the Pack URI format, and the Version portion has this description:

;Version [optional]: the version of the referenced assembly that contains the resource file. This is used when two or more referenced assemblies with the same short name are loaded.

So you'd want to use one of the following:

/ThePluginAssembly;v1.0.0.0;component/XYZ.xaml
/ThePluginAssembly;v1.1.0.0;component/XYZ.xaml