PDA

Visualizza la versione completa : [VB.NET] Errore creando Form con assembly Microsoft.ReportViewer.WinForms version 15.0.0.0


Rickycast
29-01-2019, 12:18
Dopo molte ricerche, studio e fatica, sono riuscito a creare i Report con Visual Studio 2017 (VB .Net) e poi a stamparli in PDF. Peccato che la stampa in PDF funzioni solo in Progettazioe: quando cerco di ottenerla dall'eseguibile, ottengo il seguente Messaggio di errore:

"Errore nella Sub ___ della Form____: 5 - Errore durante la creazione del Form. Per informazioni dettagliate vedere Exception.InnerException. Errore: Non è stato possibile caricare il file o l’assembly ‘Microsoft.ReportViewer.WinForms’ Version 15.0.0.0, Culture=neutral, PublicKeyToken=898545dc8080cc91 o una delle relative dipendenze. Impossibile trovare il file specificato.”

Pensando che il problema fosse il codice relativo alla creazione del File .pdf, ho provato semplicemente ad aprire la Form contenente il ReportViewer (senza chiedere la stampa in PDF):


Private Sub FormV1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Try

' questa riga di codice carica i dati nella tabella 'SisAgentiDataSet.OrigineReportOrdine'.
' È possibile spostarla o rimuoverla se necessario.
Me.OrigineReportVarCliTableAdapter.Fill(Me.SisAgen tiDataSet.OrigineReportVarCli)

Me.ReportViewer1.RefreshReport()

Catch ex As Exception
MessageBox.Show("Errore nella Sub ''FormVarCli_Load'' della Form ''FormVarCli'': " & Err.Number & " - " & Err.Description)
End Try
End Sub





come prima, funziona in Progettazione ma NON funziona dal File.exe. Mi da sempre lo stesso messaggio di errore.
Quindi ipotizzo che il problema stia nel fatto che il File.exe non è in grado di aprire una Form che contiene un ReportViewer.
In un thread molto simile a questo mio, trovato sfogliando il Web, sembrava che la soluzione fosse di posizionare l'Assembly nella stessa Directory dell'eseguibile e di cambiare il riferimento nel Progetto e poi di installare il Runtime di ReportViewer. Si trattava però di Visual Studio 2012.
Ho comunque fatto quanto suggerito per il posizionamento ed il riferimento dell'Assembly, ma non ho potuto installare il Runtime di ReportViewer 2017 che ancora non esiste (o almeno io non l'ho trovato). Credo che si possa trovare una soluzione al Runtime nei pacchetti NuGet, ma non so quale sia il più adatto alle mie necessità.
Comunque spero che qualcuno possa darmi una mano anche più in generale.
Molte grazie in anticipo

URANIO
29-01-2019, 15:30
L'errore è semplice, non trova la DLL Microsoft.ReportViewer.WinForms
Tutto dipende da come hai aggiunti i riferimenti per utilizzarla.

Se hai aggiunto il riferimento ad una dll fisica ti basta prendere la dll e metterla nel pacchetto.
Se fai riferimento alla dll in GAC devi registrarla sulla macchina in cui vuoi usare l'applicativo.

Rickycast
29-01-2019, 15:52
Porta pazienza per la mia replica, per utilizzare la dll ho fatto così:
1 - ho copiato la Directory "packages" nella Directory in cui verrà utilizzato il file .exe
2 - ho selezionato una Form qualsiasi
3 - tasto destro sulla Casella degli Strumenti
4 - Click su Scegli Elementi
5 - Click su Sfoglia e quindi Click su "packages" - "Microsoft.ReportingServices.ReportViewerControl.Wi nforms" - "lib" - "net40" - "Microsoft.ReportViewer.WinForms.dll"
6 - Quindi Click su OK!
A questo punto in Scegli Elementi compare flaggato l'Assembly Microsoft.ReportViewer.WinForms versione 15.0.0.0. con il path della Directory di lavoro.

Questo procedimento però non funziona
Cosa avrei dovuto fare invece?

U235
29-01-2019, 22:47
Porta pazienza per la mia replica, per utilizzare la dll ho fatto così:
1 - ho copiato la Directory "packages" nella Directory in cui verrà utilizzato il file .exe
2 - ho selezionato una Form qualsiasi
3 - tasto destro sulla Casella degli Strumenti
4 - Click su Scegli Elementi
5 - Click su Sfoglia e quindi Click su "packages" - "Microsoft.ReportingServices.ReportViewerControl.Wi nforms" - "lib" - "net40" - "Microsoft.ReportViewer.WinForms.dll"
6 - Quindi Click su OK!
A questo punto in Scegli Elementi compare flaggato l'Assembly Microsoft.ReportViewer.WinForms versione 15.0.0.0. con il path della Directory di lavoro.

Questo procedimento però non funziona
Cosa avrei dovuto fare invece?


ciao Riccardo 🙂
ma il tuo progetto è winform o wpf?
Se non ricordo male, usando winform devi indicare il path della cartella dalla quale hai preso la dll, in quanto si tratta di un pacchetto contenente dipendenze, quindi devi scaricare o comunque mettere nel progetto anche le sue dipendenze. Solitamente se trovi più dll è molto probabile che le deva importare tutte. Probabilmente la dll che hai messo ne richiede delle altre. Se vedi che dopo che hai scaricato il runtime nella cartella( del runtime )oltre alla dll trovi altre dll è molto probabile debba importare o semplicemente copiare nella cartella dell’exe tutti i file che trovi.

Rickycast
30-01-2019, 10:07
Buongiorno U235 e grazie per la risposta.
Io uso Winform e quindi credo (credo,..) di avere fatto come dici tu. L'Assembly in questione è compreso nella Directory "packages" che, a quanto mi è dato di capire, viene generata da Visual Studio quando si crea un nuovo Progetto. Quindi ho fatto così:
Directory di lavoro:
C:\MiaDirectory\MioProgramma.exe
C:\MiaDirectory\package\
È questo che intendi?
In ogni caso anche così non funziona, magari ci vuole proprio un Runtime di ReportViewer,...
Grazie comunque.

URANIO
30-01-2019, 11:03
No, tu devi mettere tutte le dll referenziate dentro a
c:\miadirectory

Se vai nella directory del tuo progetto dovresti avere una directory che si chiama bin con all'interno un altra directory debug (o release, dipende da come compili)
Puoi prendere quella directory

Rickycast
30-01-2019, 12:14
Risolto cambiando strada.
Viste le difficoltà nell'arrivare ad una soluzione utilizzando ReportViewer, ho provato ad utilizzare CrystalReport ed ho ottenuto quello che mi serve. Innanzitutto devo dire che Crystal Report offre molto di più e comunque non è così complicato da utilizzare, poi, che il vero problema è stato soprattutto la mia pigrizia nel non voler provare strade nuove. Questo è il vero errore!
Comunque, una volta costruito il Report con Crystal Report, per stamparlo in PDF bastano queste poche righe di codice:



Imports System.IO
Imports System.ComponentModel
Imports System.Threading
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared

Public Class MiaClass

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

Cursor = Cursors.WaitCursor
Application.DoEvents()

Dim Rpt As New ReportDocument
Dim DOp As New DiskFileDestinationOptions

' Per aprire il File PDF sul Desktop
Dim Dest As String = "C:\Users\" & Environment.UserName & "\Desktop\MioFile.pdf"

' Occorre indicare il path completo del Report: "C:\MiaDirectory\....." nel mio caso
Rpt.Load("C:\MiaDirectory\MioProgetto\MioProgetto\CrystalRep ort1.rpt", CrystalDecisions.[Shared].OpenReportMethod.OpenReportByDefault)
DOp.DiskFileName = Dest
With Rpt.ExportOptions
.DestinationOptions = DOp
.ExportDestinationType = ExportDestinationType.DiskFile
.ExportFormatType = ExportFormatType.PortableDocFormat
End With
Rpt.Refresh()
Application.DoEvents()
Rpt.Export()

' Aspetta che il Report venga creato e poi lo apre a video in PDF
Do Until System.IO.File.Exists(Dest) = True
Thread.Sleep(100)
Loop

Process.Start(Dest)
Cursor = Cursors.Default

End Sub
End Class




senza nemmeno la necessità di aprire il Report in una Form.
Anche l'eseguibile funziona senza problemi, magari è solo un poco lento, però,...
NOTE: Attenzione ad istanziare gli Imports necessari; probabilmente quelli che ho indicato sono troppi, ma mi servivano anche per altre Sub.
Io ho utilizzato .NET Framework 4.6.1
Spero possa servire.
Saluti.

Loading