Messaggio di errore quando si esegue una routine CLR o utilizza un assembly in SQL Server: "Assembly nell'archivio host ha una firma diversa dall'assembly nella Global Assembly Cache. (Eccezione da HRESULT: 0x80131050) "

Sintomi

Prendere in considerazione i seguenti scenari.

Scenario 1

Creazione di una routine common language runtime (CLR) che fa riferimento a un assembly Microsoft.NET Framework. L'assembly di.NET Framework non è documentato nell'articolo della Knowledge Base 922672. Successivamente si è installata la versione 3.5 di.NET Framework o un hotfix per.NET Framework 2.0.

Scenario 2

Si crea un assembly e quindi registrare l'assembly in un database di Microsoft SQL Server. Quindi, installare una versione diversa dell'assembly nella Global Assembly Cache (GAC).

Quando si esegue la routine CLR o utilizzare l'assembly da uno di questi scenari in SQL Server, viene visualizzato un messaggio di errore analogo al seguente:

Server: Msg 6522, livello 16, stato 2, riga 1
Si è verificato un errore di.NET Framework durante l'esecuzione di routine definita dall'utente o di aggregazione 'getsid':

System.IO.FileLoadException: Impossibile caricare il file o l'assembly ' System. DirectoryServices, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a' o una delle relative dipendenze. Assembly in archivio host ha una firma diversa dall'assembly nella Global Assembly Cache. (Eccezione da HRESULT: 0x80131050)

System.IO.FileLoadException:

Causa

Quando CLR viene caricato un assembly, Common Language Runtime verifica che lo stesso assembly nella Global Assembly Cache. Se nello stesso assembly nella GAC, CLR verifica che gli ID di versione del modulo (MVIDs) di questi assembly corrispondano. Se il MVIDs di questi assembly non corrispondono, viene visualizzato il messaggio di errore menzionato nella sezione "Sintomi".

Quando un assembly viene ricompilato, modifica MVID dell'assembly. Pertanto, se si aggiorna il.NET Framework, assembly di.NET Framework è MVIDs diverso perché tali assembly vengono ricompilati. Inoltre, se si aggiorna un assembly personalizzato, l'assembly viene ricompilata. Di conseguenza, l'assembly ha anche un MVID diversi.

Soluzione alternativa

Soluzione alternativa 1

Per risolvere lo scenario 1 nella sezione "Sintomi", è necessario aggiornare manualmente gli assembly di.NET Framework in SQL Server. A tale scopo, utilizzare l'istruzione ALTER ASSEMBLY per puntare alla nuova versione dell'assembly di.NET Framework nella seguente cartella:
%Windir%\Microsoft.NET\Framework\Version
Nota: Versione rappresenta la versione di.NET Framework che è stato installato o aggiornato.

Soluzione 2

Per risolvere lo scenario 2 nella sezione "Sintomi", utilizzare l'istruzione ALTER ASSEMBLY per aggiornare l'assembly nel database.

Se il problema persiste anche dopo questa operazione, eliminare l'assembly dal database e quindi registrare la nuova versione dell'assembly nel database.

Stato

Microsoft ha confermato che questo è un problema dei prodotti Microsoft elencati nella sezione "Si applica a".

Ulteriori informazioni

Si consiglia di non utilizzare gli assembly di.NET Framework che non sono documentati nell'articolo della Knowledge Base 922672. Articolo della Knowledge Base 922672 Elenca gli assembly che vengono testati nell'ambiente di hosting CLR di SQL Server.

Per ulteriori informazioni, fare clic sul seguente numero di articolo per visualizzare l'articolo della Microsoft Knowledge Base:
922672 i criteri di supporto per gli assembly di.NET Framework non testati nell'ambiente di hosting CLR di SQL Server

Descrizione delle routine CLR

Routine CLR includono i seguenti oggetti che vengono implementati tramite l'integrazione di SQL Server con il CLR di.NET Framework:
  • Valori scalari definita dall'utente funzioni scalari
  • Funzioni con valori di tabella definito dall'utente (le TVF)
  • Procedure definite dall'utente (UDPs)
  • Trigger definiti dall'utente
  • Tipi di dati definiti dall'utente
  • Aggregati definiti dall'utente

Assembly per l'aggiornamento dopo l'installazione di 3.5 di.NET Framework

Dopo l'installazione di 3.5 di.NET Framework, è necessario utilizzare l'istruzione ALTER ASSEMBLY per aggiornare gli assembly seguenti:
  • Accessibility.dll
  • AspNetMMCExt.dll
  • Cscompmgd.dll
  • IEExecRemote.dll
  • IEHost.dll
  • IIEHost.dll
  • Microsoft.Build.Conversion.dll
  • Microsoft.Build.Engine.dll
  • Microsoft.Build.Framework.dll
  • Microsoft.Build.Tasks.dll
  • Microsoft.Build.Utilities.dll
  • Microsoft.CompactFramework.Build.Tasks.dll
  • Microsoft.JScript.dll
  • Microsoft.VisualBasic.Vsa.dll
  • Microsoft.Vsa.dll
  • Microsoft.Vsa.Vb.CodeDOMProcessor.dll
  • Microsoft_VsaVb.dll
  • Sysglobl.dll
  • System.Configuration.Install.dll
  • System.Design.dll
  • System.DirectoryServices.dll
  • System.DirectoryServices.Protocols.dll
  • System.Drawing.dll
  • System.Drawing.Design.dll
  • System.EnterpriseServices.dll
  • System.Management.dll
  • System.Messaging.dll
  • System.Runtime.Serialization.Formatters.Soap.dll
  • System.ServiceProcess.dll
  • System.Web.dll
  • System.Web.Mobile.dll
  • System.Web.RegularExpressions.dll
Questi ultimi sono assembly nella cartella seguente:
%Windir%\Microsoft.NET\Framework\v2.0.50727

Come conservare i dati da tipi di dati definiti dall'utente, dopo avere rilasciato un assembly

Se si elimina un assembly che utilizza un tipo di dati definito dall'utente da SQL Server, è possibile utilizzare uno dei seguenti metodi per conservare i dati.

Si supponga che il seguente scenario:
  • Si crea un assembly il cui nome è
    MyAssembly.dll.
  • I riferimenti all'assembly MyAssembly il
    Assembly System.DirectoryServices.dll .
  • Si dispone di un tipo di dati definito dall'utente il cui nome è
    MyDateTime.
  • Il tipo di dati MyDateTime utilizza l'assembly myAssembly. dll.
  • Per creare una tabella il cui nome è MyTable.
  • La tabella MyTable contiene i dati del tipo di dati MyDateTime .

Metodo 1: Utilizzare l'utilità bcp.exe

  1. Per copiare i dati dalla tabella MyTable in un file, utilizzare l'utilità di Bcp.exe con l'opzione – n . Ad esempio, eseguire il comando seguente al prompt dei comandi:
    bcp MyDatabase.dbo.MyTable out C:\MyFile.bcp -n –SSQLServerName  -T
  2. In SQL Server Management Studio, attenersi alla seguente procedura:
    1. Eliminare la tabella MyTable.
    2. Eliminare il tipo di dati MyDateTime .
    3. DROP assembly System.DirectoryServices.dll .
    4. Eliminare l'assembly MyAssembly .
  3. In SQL Server Management Studio, attenersi alla seguente procedura:
    1. Registrare l'assembly System.DirectoryServices.dll .
    2. Registrare l'assembly MyAssembly .
    3. Creare il tipo di dati MyDateTime .
    4. Creare una nuova tabella che ha la stessa struttura di tabella come tabella MyTable.
  4. Utilizzare l'utilità Bcp.exe con l'opzione – n per importare i dati dal file della tabella MyTable. Ad esempio, eseguire il comando seguente al prompt dei comandi:
    bcp MyDatabase.dbo.MyTable in C:\MyFile.bcp -n –SSQLServerName  -T

Metodo 2: Utilizzare l'istruzione INSERT... Istruzione SELECT

Si supponga che il tipo di dati MyDateTime occupa 9 byte in memoria.
  1. In SQL Server Management Studio, creare una nuova tabella contenente una colonna del tipo di dati VARBINARY(9) eseguendo la seguente istruzione:
    CREATE TABLE TempTable (c1 VARBINARY(9))
  2. Eseguire il seguente INSERT... Selezionare istruzione per compilare la tabella TempTable:
    INSERT INTO TempTable SELECT CAST(c1 as VARBINARY(9)) FROM MyTable
  3. In SQL Server Management Studio, attenersi alla seguente procedura:
    1. Eliminare la tabella MyTable.
    2. Eliminare il tipo di dati MyDateTime .
    3. DROP assembly System.DirectoryServices.dll .
    4. Eliminare l'assembly MyAssembly .
  4. In SQL Server Management Studio, attenersi alla seguente procedura:
    1. Registrare l'assembly System.DirectoryServices.dll .
    2. Registrare l'assembly MyAssembly .
    3. Creare il tipo di dati MyDateTime .
    4. Creare una nuova tabella che ha la stessa struttura di tabella come tabella MyTable.
  5. Eseguire il seguente INSERT... Selezionare istruzione per compilare la tabella MyTable:
    INSERT INTO MyTable SELECT c1 FROM TempTable

Riferimenti

Per ulteriori informazioni sulla versione dell'assembly, visitare il seguente sito Web Microsoft Developer Network (MSDN):
Per ulteriori informazioni su come aggiornare un assembly, visitare il seguente sito Web MSDN:
Per ulteriori informazioni su come eliminare un assembly, visitare il seguente sito Web MSDN:
Per ulteriori informazioni su come registrare un assembly in un database di SQL Server 2005, visitare il seguente sito Web MSDN:
Per ulteriori informazioni sull'utilità Bcp.exe, visitare il seguente sito Web MSDN:
Proprietà

ID articolo: 949080 - Ultima revisione: 31 gen 2017 - Revisione: 1

Microsoft SQL Server 2012 Enterprise, Microsoft SQL Server 2012 Standard, Microsoft SQL Server 2012 Developer, Microsoft SQL Server 2008 R2 Enterprise, Microsoft SQL Server 2008 R2 Developer, Microsoft SQL Server 2008 R2 Datacenter, Microsoft SQL Server 2008 R2 Workgroup, Microsoft SQL Server 2008 R2 Standard, Microsoft SQL Server 2008 Standard, Microsoft SQL Server 2008 Workgroup, Microsoft SQL Server 2008 Developer, Microsoft SQL Server 2008 Enterprise, Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Workgroup Edition, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 Enterprise Edition

Feedback