Microsoft Report Viewer

0

Zamiast odwołania do bibliotek (i dystrybucji aplikacji z oddzielnymi dll-kami), chciałem wrzucić pliki Microsoft.ReportViewer.Common.dll, Microsoft.ReportViewer.ProcessingObjectModel.dll oraz Microsoft.ReportViewer.WinForms.dll (i inne) do zasobów aplikacji.

W momencie usunięcia odwołania do biblioteki Microsoft.ReportViewer.WinForms.dll i wrzucenia jej do zasobu pojawił się (co oczywiste) problem - kompilator zwrócił komunikat:

Błąd CS0246	Nie można znaleźć nazwy typu lub przestrzeni nazw „ReportParameter” (brak dyrektywy using lub odwołania do zestawu?)

stąd też nie można użyć dyrektywy using Microsoft.Reporting.WinForms; m.in. dla typu ReportParameter. Czy jest techniczna możliwość rozwiązania tego problemu pozostawiając Microsoft.ReportViewer.WinForms.dll w zasobach aplikacji??

reportViewer.LocalReport.LoadReportDefinition(GetReportDefinition());
reportViewer.LocalReport.ReportEmbeddedResource="ReportPDF.rdlc";   //Jak widać ReportPDF.rdlc też jest wrzucony do zasobów...
ReportParameter rp = new ReportParameter("PDF", "treść  pdf-a");// tu jest błąd - nie można znaleźć nazwy typu
0

Proszę bardzo: https://stackoverflow.com/questions/189549/embedding-dlls-in-a-compiled-executable
Jest jeszcze inne rozwiązanie, które zastosowałem w jednym ze swoich projektów, ale teraz nie pamiętam jak się nazywała tamta biblioteka. Jeśli ta odpowiedź Ci nie wystarczy, to daj znać. Poszukam wieczorem.

0
Juhas napisał(a):

Proszę bardzo: https://stackoverflow.com/questions/189549/embedding-dlls-in-a-compiled-executable [...]

Strona znajoma... Tylko na konkretne pytanie dostałem niekonkretną odpowiedź ;-P Przeczytałem jeszcze raz, uważniej tą stronę i powiem tak: chodzi mi o rozwiązanie bez dodatkowych bibliotek, czyli dll-ki ładuję w zasoby i przed wywołaniem Application.Run(new MainWindow()) ładuję je z zasobów:

 static void Main()
    {
      
      Load("MojaPrzestrenNazw", "Microsoft.ReportViewer.WinForms.dll");
      Load("MojaPrzestrenNazw", "Microsoft.ReportViewer.Common.dll");
      Load("MojaPrzestrenNazw", "Microsoft.ReportViewer.ProcessingObjectModel.dll");
     
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new MainWindow());
    }
    static void Load(string nameSpace, string assemblyName)
    {
      AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
      {
        String resourceName = nameSpace + "." + assemblyName + ".dll";
        using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
        {
          Byte[] assemblyData = new Byte[stream.Length];
          stream.Read(assemblyData, 0, assemblyData.Length);
          return Assembly.Load(assemblyData);
        }
      };
    }

I teraz wrzuciłem ponownie do projektu odwołanie do Microsoft.ReportViewer.WinForms.dll (mając tą bibliotekę równocześnie w zasobach) a we właściwościach odwołania tej biblioteki parametr Kopia Lokalna z True zmieniłem na false. Program się wtedy kompiluje, ale jeżeli skasuję z folderu programu plik Microsoft.ReportViewer.WinForms.dll to program się już nie uruchamia a przecież ta dll-ka jest w zasobach aplikacji. Co robić? Jak żyć? Jak zatem rozwiązać ten problem?

0
cs.net napisał(a):
String resourceName = nameSpace + "." + assemblyName + ".dll";

p.s malutkie sprostowanie: w kodzie w powyższej linijce ma nie być części: [ + ".dll" ]

Obecnie mam komunikat

Nie można załadować typu 'Microsoft.ReportingServices.StandalonePreviewStore' z zestawu 'Microsoft.ReportViewer.WinForms, Version=15.0.0.0
0

Pomimo umieszczenia bibliotek dll w zasobach nadal muszą pozostać lokalne kopie dwóch bibliotek: Microsoft.ReportViewer.ProcessingObjectModel.dll oraz Microsoft.ReportViewer.Common.dll ------ Jeżeli usunę choćby którąkolwiek z powyższych bibliotek program generuje błąd:
"Microsoft.Reporting.WinForms.LocalProcessingException: An error occurred during local report processing. ---> Microsoft.Reporting.DefinitionInvalidException: The definition of the report '' is invalid. ---> Microsoft.ReportingServices.ReportProcessing.ReportProcessingException: An unexpected error occurred in Report Processing. ---> System.ArgumentException: Właściwość „ReferencedAssemblies” nie może zawierać pustych lub zerowych ciągów."

Nawiasem mówiąc Microsoft.ReportViewer.WinForms.dll jest w zasobach i nie musi być jej lokalnej kopii (w katalogu z programem).

Jakieś propozycje rozwiązania ?? Ktoś wie gdzie leży problem ?

0

Ale po co takie kombinacje? Ładować dllki do zasobów, a potem je z zasobów wyciągać. To imho zupełnie bez sensu. Znalazłem ten programik, o którym pisałem wcześniej: ILMerge
Może tym się zainteresuj? On bierze kilka dllek i wrzuca Ci je do jednego execa (tak, jakby to były liby z C++). Nie musisz niczego później wyciągać z zasobów. A całość ogarniesz skryptem na post buildzie.

0
Juhas napisał(a):

Ale po co takie kombinacje? Ładować dllki do zasobów, a potem je z zasobów wyciągać.

Wyciągać w sensie, że przy uruchomieniu aplikacji zapisać na dysku? Nie, nie chodzi o to. Chcę tylko, żeby je z zasobów ładować - zasobów wykorzystywać - żeby dystrybucja aplikacji mogła się odbywać tylko poprzez skopiowanie samego pliku exe bez zewnętrznych dll.

0

powalczyłem i obecnie mam taki błąd po kompilacji - w momencie wywołania metody

Microsoft.Reporting.WinForms.LocalProcessingException: An error occurred during local report processing. ---> Microsoft.ReportingServices.ReportProcessing.ReportProcessingException: Failed to load expression host assembly. Details: Reguły zabezpieczeń dziedziczenia zostały naruszone przez typ: ReportExprHostImpl. Dostępność zabezpieczeń typów pochodnych musi być taka sama jak dostępność zabezpieczeń typu podstawowego lub mniejsza.
0

Dodanie poniższego kodu rozwiązało problem

var sec = new System.Security.PermissionSet(System.Security.Permissions.PermissionState.Unrestricted);
reportViewer.LocalReport.SetBasePermissionsForSandboxAppDomain(sec);

1 użytkowników online, w tym zalogowanych: 0, gości: 1