L'app che fa riferimento a Microsoft.SqlServer.Smo richiede l'inclusione di assembly aggiuntivi nella macchina di destinazione?

StackOverflow https://stackoverflow.com/questions/76933

  •  09-06-2019
  •  | 
  •  

Domanda

Ho una piccola app che fa riferimento all'assembly Microsoft.SqlServer.Smo (così posso visualizzare all'utente un elenco di server e database a cui può connettersi).

La mia applicazione originariamente faceva riferimento a Microsoft.SqlServer.Smo e Microsoft.SqlServer.ConnectionInfo.Le cose hanno funzionato come previsto sul mio dispositivo di sviluppo.

Quando ho installato l'applicazione su una macchina di prova, ho ricevuto un file System.IO.FileNotFoundException.I dettagli del messaggio includevano quanto segue:Impossibile caricare il file o l'assembly Microsoft.SqlServer.SmoEnum

Alla fine ho risolto il problema facendo riferimento ai seguenti assembly oltre a quelli menzionati sopra:

  • Microsoft.SqlServer.SmoEnum
  • Microsoft.SqlServer.SqlEnum
  • Microsoft.SqlServer.BatchParser
  • Microsoft.SqlServer.Replication

Qualcuno può confermare che devo effettivamente includere ciascuno di questi assembly aggiuntivi nella mia applicazione (e quindi installarli sui computer dell'utente) anche se l'app si basa correttamente sulla mia casella di sviluppo senza che venga fatto riferimento?

È stato utile?

Soluzione

Sì, devono essere inclusi.Sul computer di sviluppo probabilmente è installato SQL Server, che inserisce tali assembly nella Global Assembly Cache.Ogni volta che crei, Visual Studio li estrae semplicemente dal GAC.Si presuppone inoltre che anche il GAC di qualunque computer su cui verrà distribuito avrà tali file.In caso contrario, genera l'eccezione FileNotFound.

Altri suggerimenti

È necessario installare due file MSI su un computer di destinazione, vale a dire:

1) SQLSysClrTypes.msi [questo è necessario per C# -> SMO GAC]

2) SharedManagementObjects.msi

Per SQL Server 2014 puoi scaricarli Qui.

Inoltre, è necessario assicurarsi che la versione sia corretta.Questi due file possono essere trovati cercando su Google.In questo modo non copi nulla in locale e verranno risolti da GAC.

So che questa è una vecchia domanda, ma le risposte non sono state soddisfacenti.

Poiché JIT si collega ad assembly esterni in fase di esecuzione, non è possibile rispondere a questa domanda senza analizzare il codice e vedere cosa chiami e, a sua volta, cosa chiamano quelle chiamate, ecc.

Se vuoi analizzarlo tu stesso, la soluzione migliore sarebbe fare riferimento solo all'assembly necessario e quindi imparare dalle eccezioni e dalle eccezioni interne cosa è successo.

Un'altra cosa che dovresti esaminare è il motivo per cui le quattro assemblee che menzioni non sono nel GAC.Sembra proprio che dovrebbero esserlo.

Per me questa risposta si è rivelata non vera.Ho aggiunto i riferimenti sopra ma senza risoluzione.Alla fine ho scoperto che mi serviva solo il riferimento:

Microsoft.SqlServer.Smo

...e la seguente delibera:

Ricevo l'errore "È stato effettuato un tentativo di caricare un programma con un formato errato" su un progetto di replica di SQL Server

Per riassumere, dovevo abilitare il mio IIS 6 per abilitare l'applicazione a 32 bit sul pool di app IIS.Questo perché avevo Win 7 x64 ma un'installazione SQL x86.Peccato che il messaggio di errore non possa essere più specifico, eh?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top