2008-10-31 5 views
38

Windows 서비스 및 양식 응용 프로그램에서 사용하는 보고서가 있습니다. 그래서, 둘 다 사용할 수있는 DLL 파일에 보고서를 넣고 싶습니다.DLL 파일에 포함 된 .RDLC 보고서 표시

문제점은 내 Windows 양식 응용 프로그램에서 ReportViewer 컨트롤의 ReportEmbeddedResource 속성을 설정하려고하면 dll 파일이 아닌 리소스에 대한 Windows 양식 응용 프로그램을 검색한다는 것입니다.

예컨대 : 코드 윈도우 폼 응용 프로그램에서 :

rv.LocalReport.ReportEmbeddedResource = "MyReportInMyDLLFile.rdlc" 
내 DLL 파일에 포함 된 리소스에 대한 위의 명령 모양을 만들 수있는 방법

?

답변

53

뭔가를 수행해야합니다

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

나는 당신을 사랑합니다. –

+1

위의 코드를 SharePoint 2010의 '응용 프로그램 페이지'에서 사용할 때 다음과 같은 오류가 발생했습니다. '파일 또는 어셈블리'file : /// c : \ windows \ system32 \ inetsrv \ Reports.dll '또는 해당 종속성 중 하나를로드 할 수 없습니다. . 시스템은 지정된 파일을 찾을 수 없습니다 .',하지만 그것은 WinForm 응용 프로그램에서 작동합니다. – Amir

+0

그런 낡은 대답 ..하지만 오늘처럼 잘 작동합니다! 나는 아래의 답을 따랐다. 두 개의 폴더 안에있는 다른 어셈블리에서 보고서를 얻었을 때, 단순히 작동하지 않았고, 그렇다면 그것은 임베디드 리소스였다. 이 대답의 두 번째 줄에 복사하여 붙여 넣으면 효과가있었습니다. – sksallaj

10

아마 가장 좋은 방법은 다른 어셈블리에서 RDLC 리소스로 스트림을 가져 와서 보고서 뷰어 컨트롤의 "LoadReportDefinition"메서드로 전달하는 것입니다. 다른 어셈블리에 포함 된 리소스에서 스트림을 얻는 방법의

자세한 내용은 여기를 찾을 수 있습니다 Retrieving Resources with the ResourceManager Class

또한, 당신이 전체 네임 스페이스 경로의 사용 포함 된 리소스를 참조해야합니다.

예. 당신이 TheApp의 기본 네임 스페이스를 사용하여 응용 프로그램을 가지고, 당신은 "보고서"라는 폴더에 "MyReport.rdlc"라는 보고서를 유지하는 경우, 보고서 참조 호출은 다음과 같습니다 -

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

그냥 어셈블리의 전체 네임 스페이스를 사용하여 다음 폴더 이름과 그 파일의 이름 :

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

그런 다음 등록 정보 창을 사용하여 보고서 파일이 포함 된 리소스로 설정되어 있는지 확인하십시오.

+1

folder1.folder2 부분이 중요했습니다. 감사! – Jake

+4

꽤 확신 할 수는 없지만 보고서가이 코드가있는 동일한 어셈블리에있는 경우에만 작동하는 것 같습니다. –

+0

@ GuillermoGutiérrez 맞습니다. 보고서는 동일한 어셈블리에서만 포함 된 RDLC를 읽을 수 있습니다. 그렇지 않으면 예외가 발생합니다. "이름이 MyNamespace.MyReport.rdlc 인 정의가 없습니다." –

관련 문제