O.k, esto es realmente irritante, había notado previamente que el código generado por WPF para cargar recursos XAML no parecía usar nombres fuertes y por lo tanto puede ser problemático para escenarios en los que necesite apoyar versiones de WPF codo a codo.Cómo forzar a WPF a usar los URI de recursos que usan el nombre fuerte de ensamblado? Argh!
Esto ha sido el caso, y ahora me está causando problemas. Tengo un sistema de complemento que se supone que admite instalación paralela de complementos que solo difieren en sus números de versión (sus versiones de ensamblaje) . Esto por supuesto puede ser soportado por .NET ya que se determina que los ensamblados tienen diferentes identidades incluso si tienen el mismo nombre de archivo DLL, siempre que tengan un nombre fuerte y tengan una clave pública/privada diferente O tengan un número de versión de ensamblaje diferente.
Ahora bien, si nos fijamos en el código generado para las ventanas y controles de usuario de Visual Studio, que vemos en el archivo generado automáticamente lo siguiente:
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/Sensormatic.AMK1000.Panel;component/views/servicepanelui.xaml", System.UriKind.Relative);
#line 1 "..\..\..\Views\ServicePanelUI.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
Aviso de la línea donde se crea el localizador de recursos - es está utilizando un URI relativo que no especifica el nombre fuerte o la versión del ensamblado que contiene el recurso xaml.
Pensé que quizás LoadComponent verificaría la identidad del ensamblado que llama y usaría su clave pública y detalles de la versión o tal vez verificaría la identidad del ensamblado que contiene el tipo para el parámetro 'this'.
Parece que no es el caso: si tiene dos ensamblajes con números de versión diferentes (pero el mismo nombre de archivo) puede obtener una IOException con el mensaje "No se puede localizar el recurso X" (para el ejemplo anterior "No se puede localizar el recurso 'views/servicepanelui.xaml'.
Peor, estoy bastante seguro de que esto también significará que los ensamblados con el mismo nombre de archivo pero diferente clave pública/privada, es decir, de diferentes editores, también darán como resultado este error
Entonces, ¿alguien sabe cómo evitar esto? Cómo hacer que WPF sea compatible con el nombre
Nota, en lo que a mí respecta, este es un error de WPF. No debería tener que usar el aislamiento Appdomain solo para evitar esto.
Hola Phil, estoy enfrentando el mismo problema. ¿Pudiste encontrar alguna solución a esto? –
¿Alguien ha enfrentado un problema similar con los controles personalizados de WPF que utilizan temas (a través de diccionarios de recursos)? Si es así, ¿alguna solución para eso? – akjoshi
alguna noticia sobre esto? –