2008-10-31 4 views
38

Ich habe einen Bericht, der von einem Windows-Dienst und einer Formularanwendung verwendet wird. Also, ich möchte den Bericht in eine DLL-Datei einbetten, die von beiden verwendet werden kann.Anzeige .RDLC-Bericht eingebettet in eine DLL-Datei

Das Problem ist, dass, wenn ich versuche, die ReportEmbeddedResource -Eigenschaft eines ReportViewer-Steuerelement in meiner Windows-Formular-App, die Windows-Formular-App für die Ressource, nicht die DLL-Datei suchen.

z.B .:-Code aus dem Fenster Formular App:

rv.LocalReport.ReportEmbeddedResource = "MyReportInMyDLLFile.rdlc" 

Wie kann ich den oben genannten Befehl Look für die eingebettete Ressource in meiner DLL-Datei zu machen?

Antwort

53

So etwas sollte es tun:

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

Ich liebe dich dafür. –

+1

Wenn ich obigen Code in 'Anwendung Seite' in SharePoint 2010 verwende, folgenden Fehler ausgelöst:' Datei oder Assembly Datei: /// C: \ Windows \ System32 \ Inetsrv \ Reports.dll 'oder eine seiner Abhängigkeiten konnte nicht geladen werden . Das System kann die angegebene Datei nicht finden.', aber es funktioniert in WinForm-Anwendungen. – Amir

+0

Solch eine alte Antwort .. aber funktioniert genauso gut wie heute! Ich folgte den Antworten unter .. wo ich einen Bericht in einer anderen Versammlung in zwei Ordnern habe, und es hat einfach nicht funktioniert, und ja, es war eine eingebettete Ressource. Ich habe es kopiert und in die zweite Zeile dieser Antwort eingefügt, und es hat funktioniert! – sksallaj

10

Wahrscheinlich wäre es am besten, einen Stream von der anderen Assembly an die RDLC-Ressource zu senden und diese dann an die "LoadReportDefinition" -Methode des Report Viewer-Steuerelements zu übergeben.

Einzelheiten, wie ein Strom aus einer eingebetteten Ressource in einer anderen Anordnung bekommen Sie hier: Retrieving Resources with the ResourceManager Class

Zusätzlich Sie auf die eingebettete Ressource verweisen müssen, es ist voll Namespace-Pfad verwenden.

z. wenn Sie eine Anwendung mit einem Standard-Namespace von TheApp haben, und Sie halten einen Bericht namens „MyReport.rdlc“ in einem Ordner „Reports“ genannt, würde der Bericht Referenzstelle sein: -

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

einfach den vollständigen Namespace der Baugruppe verwenden, dann Ordnernamen und dann den Namen der Datei ein:

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

Stellen Sie dann sicher, dass die Berichtsdatei über den Eigenschaftenbereich als eingebettete Ressource festgelegt ist.

+1

Der Ordner folder1.folder2 war kritisch. Vielen Dank! – Jake

+4

Ich bin nicht ganz sicher, aber ich denke, das funktioniert nur, wenn der Bericht in derselben Baugruppe ist, in der dieser Code ist. –

+0

@ GuillermoGutiérrez Sie haben Recht: Der Bericht kann die eingebettete RDLC nur in der gleichen Assembly lesen, sonst wird eine Ausnahme "Es gibt keine Definitionen mit dem Namen MyNamespace.MyReport.rdlc" –