2008-10-31 29 views
38

Tengo un informe que es utilizado por un servicio de Windows y una aplicación de formulario. Por lo tanto, quiero incluir el informe en un archivo DLL que pueda ser utilizado por ambos.Mostrar el informe .RDLC incrustado en un archivo DLL

El problema es que si trato de establecer la propiedad ReportEmbeddedResource de un control ReportViewer en mi aplicación de formulario de Windows, buscará la aplicación de formularios de Windows para el recurso, no el archivo dll.

ej .: Código de la forma de las ventanas de aplicaciones:

rv.LocalReport.ReportEmbeddedResource = "MyReportInMyDLLFile.rdlc" 

¿Cómo puedo hacer que el comando anterior para el recurso incrustado en mi archivo DLL?

Respuesta

53

Algo así debe hacerlo:

Assembly assembly = Assembly.LoadFrom("Reports.dll"); 
Stream stream = assembly.GetManifestResourceStream("Reports.MyReport.rdlc"); 
reportViewer.LocalReport.LoadReportDefinition(stream); 
+8

Te amo por esto. –

+1

Cuando uso el código anterior en la 'página de la aplicación' en SharePoint 2010, aparece el siguiente error: 'No se pudo cargar el archivo o ensamblado 'file: /// c: \ windows \ system32 \ inetsrv \ Reports.dll' o una de sus dependencias . El sistema no puede encontrar el archivo especificado., Pero funciona en las aplicaciones de WinForm. – Amir

+0

Una respuesta tan antigua ... ¡pero funciona tan bien como hoy! Seguí las respuestas a continuación ... donde tengo un informe en otro ensamblado dentro de dos carpetas, y simplemente no funcionó, y sí, era un recurso incrustado. Lo copié y pegué en la segunda línea de esta respuesta, ¡y funcionó! – sksallaj

10

Probablemente lo mejor que se puede hacer es obtener un flujo del recurso RDLC del otro ensamblado, luego pasarlo al método "LoadReportDefinition" del control Report Viewer.

detalles de cómo obtener una corriente de un recurso incrustado en un montaje diferente se pueden encontrar aquí: Retrieving Resources with the ResourceManager Class

Además, tendrá que hacer referencia al recurso incrustado utilizando su ruta completa del espacio de nombres.

E.g. si usted tiene una aplicación con un espacio de nombres por defecto de theApp, y se mantiene un informe llamado "MyReport.rdlc" en una carpeta llamada "Informes", la llamada de referencia informe sería: -

rv.LocalReport.ReportEmbeddedResource = "TheApp.Reports.MyReport.rdlc"; 
22

Sólo tiene que utilizar el espacio de nombres completo de la asamblea, a continuación, los nombres de las carpetas y luego el nombre del archivo:

rv.LocalReport.ReportEmbeddedResource = 
    "My.Assembly.Namespace.Folder1.Folder2.MyReport.rdlc"; 

Luego, asegúrese de que el archivo de informe esté configurado como un recurso incrustado utilizando el panel de propiedades.

+1

La parte folder1.folder2 era crítica. ¡Gracias! – Jake

+4

No estoy muy seguro, pero supongo que esto solo funciona si el informe está en el mismo ensamblado donde está este código. –

+0

@ GuillermoGutiérrez tiene razón: el informe puede leer el RDLC incorporado solo en el mismo ensamblado, de lo contrario lanzará una excepción "No hay definiciones con el nombre MyNamespace.MyReport.rdlc" –

Cuestiones relacionadas