2010-07-28 21 views
5

Tengo un control de usuario UserControl que está en un ensamblado de ensamblaje. Tengo una aplicación WPF que ejemplifica UserControl de forma programática. Ya he agregado una referencia a la Asamblea. Sin embargo, durante el tiempo de ejecución obtengo el ff. excepción:System.IO.IOException en PresentationFramework.dll en la creación de instancias de un control de usuario en WPF

Cannot locate resource 'usercontrol.xaml'. 
    at MS.Internal.AppModel.ResourcePart.GetStreamCore(FileMode mode, FileAccess access) 
    at System.IO.Packaging.PackagePart.GetStream(FileMode mode, FileAccess access) 
    at System.IO.Packaging.PackagePart.GetStream() 
    at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator) 
    ... 

me cambió la acción acumulación de UserControl.xaml a EmbeddedResource pero esto causó problemas de compilación así que lo puse de nuevo a la configuración predeterminada de página. He intentado esto en .NET 3 y 4 inútilmente. ¿Alguien tiene alguna idea?

+1

solución limpia y reconstruir, puede ser que le ayudará. –

+0

Ya lo intenté sin éxito. –

+0

Extraño ... Creé una nueva versión para probar la respuesta de Ray Burns a continuación y ahora parece estar funcionando bien. Podría haber jurado que hice al menos dos ciclos de construcción limpia. –

Respuesta

6

La causa más común de esto es si cambia el nombre de un conjunto. Explicaré ese escenario, luego daré otras posibilidades.

Supongamos que tiene un proyecto de DLL "Abc" que contiene UserControl "MyControl". El InitializeComponent generado para MyControl en Abc.dll contendrá el Uri "/Abc;Component/MyControl.xaml".

En tiempo de ejecución, se extrae el nombre del ensamblado "Abc" y se buscan los conjuntos cargados para un ensamblaje con ese nombre. Si se encuentra dicho ensamblado pero no tiene un recurso "MyControl.xaml", recibirá el error que publicó en la pregunta.

Así que aquí está el panorama:

  • cambia el nombre del archivo Abc.dll a Def.dll
  • Usted (o alguien) crea un archivo diferente Abc.dll
  • En su proyecto se hace referencia Def.dll (que fue compilado como Abc.dll)
  • su proyecto también hace referencia directa o indirectamente Abc.dll por lo que se carga cuando se crea una instancia MyControl

Ahora cuando instancias MyControl desde Def.dll, busca su xaml en el ensamblado Abc.dll en lugar del ensamblado Def.dll.

Algunos otros escenarios en los que esto puede suceder:

  • Tiene un archivo .g.cs rancio en su directorio obj que tiene el nombre equivocado para el archivo XAML. Esto puede suceder si cambiaste el código fuente sin actualizar la fecha (lo que puede ocurrir durante un pago desde un sistema de control de origen o descomprimir un archivo comprimido o de muchas otras maneras). Limpiar y reconstruir la solución solucionará esto. Como su comentario dice que probó esto, esto no se aplica a usted.

  • Estás editando manualmente los nombres de recursos en el archivo .dll después de que ha sido compilado

  • ha cargado dos conjuntos con el mismo nombre (sí, esto es posible), y el cargador de recursos encontrado el mal uno

Tenga en cuenta que cualquier cambio en la ruta de acceso al archivo XAML, tales como el cambio de nombre o moverlo, puede causar este problema si el archivo .g.cs no coincide con la trayectoria de los recursos.

Para diagnosticar su problema más le recomendamos que descargue una copia de NET Reflector y mire su.Archivo dll para ver:

  1. ¿Qué Uri especifica InitializeComponent()?
  2. ¿Hay un archivo .baml con el mismo nombre?

También puede examinar la pila de llamadas en el punto donde se lanza la excepción para asegurarse de que el administrador de recursos que está utilizando tiene una referencia al ensamblado esperado, no a otro ensamblaje.

+0

¿Por qué está buscando el XAML? Pensé que el XAML es necesario solo para derivar el archivo g.cs. –

+0

Reconstrucción parece haber hecho el truco. Creé una nueva versión para probar tu respuesta y no la volví a encontrar. Sé que dije que ya probé esto y estoy realmente seguro de haberlo hecho. –

+2

Para responder a su pregunta: Cuando construye su proyecto, su archivo .xaml se convierte en dos archivos: un archivo .g.cs y un archivo .baml. El compilador de C# compila el archivo .g.cs a IL y lo incluye en su ensamblado. El archivo .baml se agrega a su conjunto como un recurso. En el archivo .g.cs, la ruta al archivo .baml aparece en la lista, pero tiene la extensión ".xaml". Application.LoadComponent tiene una lógica interna que reemplaza la extensión ".xaml" por ".baml" antes de buscar los recursos en el ensamblado. Por lo tanto, tiene IL (código) que especifica ".xaml" pero el recurso en sí tiene la extensión ".baml". –

0

Recibí este error después de mover todas mis ventanas WPF a una nueva carpeta en el Proyecto llamada "Windows". He corregido el error, vaya a "App.xaml" y la actualización de la ruta de la ventana principal a:

StartupUri = "Windows \ MainWindow.xaml"

Cuestiones relacionadas