Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WPF control throwing 'resource identified by the URI missing' exception

Tags:

c#

wpf

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!

like image 269
Manish Basantani Avatar asked Feb 14 '11 14:02

Manish Basantani


2 Answers

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
like image 90
CodeNaked Avatar answered Sep 17 '22 12:09

CodeNaked


try to use Assembly.LoadFrom() instead of Assembly.Load() or Assembly.LoadFile().

I had the same problem: I used to load assemblies with Assembly.LoadFile(). After searching for days, I found out that Assembly.LoadFile() and Assembly.Load() are deprecated. Both methods create problems in the runtime. So I used Assembly.LoadFrom() and it worked.

like image 36
user2484978 Avatar answered Sep 18 '22 12:09

user2484978