Mensaje de error al ejecutar una rutina CLR o utilizar un ensamblado en SQL Server: "ensamblado en el almacén de host tiene una firma diferente a la del ensamblado en la GAC. (Excepción de HRESULT: 0x80131050) "

Se aplica a: SQL Server 2012 EnterpriseSQL Server 2012 StandardSQL Server 2012 Developer

Síntomas


Considere los escenarios siguientes.

Escenario 1

Crear una rutina de common language runtime (CLR) que hace referencia a un ensamblado de Microsoft.NET Framework. El ensamblado de.NET Framework no está documentado en el artículo de Knowledge Base 922672. A continuación, instalar la 3.5 de.NET Framework o una revisión basada en.NET Framework 2.0.

Escenario 2

Crear un ensamblado y, a continuación, registrar el ensamblado en una base de datos de Microsoft SQL Server. A continuación, instalar una versión diferente del ensamblado en la caché de ensamblados Global (GAC).

Cuando ejecute la rutina CLR o utilizar el ensamblado de cualquiera de estos escenarios en SQL Server, recibirá un mensaje de error similar al siguiente:

Servidor: Msg 6522, nivel 16, estado 2, línea 1
Se ha producido un error de.NET Framework durante la ejecución de la rutina de definido por el usuario o agregado 'getsid':

System.IO.FileLoadException: No se pudo cargar archivo o ensamblado ' System.DirectoryServices, versión = 2.0.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a' o alguna de sus dependencias. Ensamblado en el almacén de host tiene una firma diferente a la del ensamblado en GAC. (Excepción de HRESULT: 0x80131050)

System.IO.FileLoadException:

Causa


Cuando el CLR carga un ensamblado, el CLR comprueba que es el mismo ensamblado en la GAC. Si es el mismo ensamblado en la GAC, el CLR comprueba que coinciden con los identificadores de versión de módulo (MVIDs) de estos ensamblados. Si no coinciden el MVIDs de estos ensamblados, recibirá el mensaje de error que se menciona la sección "Síntomas".

Cuando se vuelve a compilar un ensamblado, se cambia el MVID del ensamblado. Por lo tanto, si actualiza el.NET Framework, los ensamblados de.NET Framework tienen diferentes MVIDs porque se vuelven a compilar los ensamblados. Además, si actualiza su propio ensamblado, el ensamblado se vuelve a compilar. Por lo tanto, el ensamblado también tiene un MVID diferente.

Solución alternativa


Solución 1

Para evitar el escenario 1 en la sección "Síntomas", deberá actualizar manualmente los ensamblados de.NET Framework en SQL Server. Para ello, utilice la instrucción ALTER ASSEMBLY para que apunte a la nueva versión del ensamblado de.NET Framework en la siguiente carpeta:
%Windir%\Microsoft.NET\Framework\Version
Nota: Versión representa la versión de la de.NET Framework que se instalan o actualizan.

Solución 2

Para evitar el escenario 2 en la sección "Síntomas", utilice la instrucción ALTER ASSEMBLY para actualizar el ensamblado en la base de datos.

Si el problema persiste después de hacerlo, quitar el ensamblado de la base de datos y, a continuación, registrar la nueva versión del ensamblado en la base de datos.

Estado


Microsoft ha confirmado que se trata de un problema de los productos de Microsoft que se enumeran en la sección "Aplicable a".

Más información


No es recomendable utilizar los ensamblados de.NET Framework que no están documentados en el artículo de Knowledge Base 922672. Artículo de Knowledge Base 922672 enumera los ensamblados que se evalúan en el entorno alojado en CLR de SQL Server.

Para obtener más información, haga clic en el siguiente número de artículo para verlo en Microsoft Knowledge Base:
Directiva de soporte técnico 922672 para ensamblados de.NET Framework no se hayan probado en el entorno alojado en CLR de SQL Server

Descripción de rutinas CLR

Rutinas CLR incluyen los siguientes objetos que se implementan mediante la integración de SQL Server con el CLR de.NET Framework:
  • Funciones definidas por el usuario con valores escalares (UDF escalares)
  • Funciones definidas por el usuario con valores de tabla (TVF)
  • Procedimientos definidos por el usuario (UDPs)
  • Desencadenadores definidos por el usuario
  • Tipos de datos definidos por el usuario
  • Agregados definidos por el usuario

Ensamblados para actualizar después de instalar la 3.5 de.NET Framework

Después de instalar la 3.5 de.NET Framework, debe utilizar la instrucción ALTER ASSEMBLY para actualizar los ensamblados siguientes:
  • 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
Estos ensamblados se encuentran en la carpeta siguiente:
%Windir%\Microsoft.NET\Framework\v2.0.50727

Cómo conservar los datos de los tipos de datos definidos por el usuario después de eliminar un ensamblado

Si coloca un ensamblado que utiliza un tipo de datos definido por el usuario de SQL Server, puede utilizar uno de los métodos siguientes para conservar los datos.

Suponga que el siguiente es el escenario:
  • Crear un ensamblado cuyo nombre es
    MyAssembly.dll.
  • Las referencias de ensamblado MyAssembly el
    Ensamblado System.DirectoryServices.dll .
  • Tiene un tipo de datos definido por el usuario cuyo nombre es
    MyDateTime.
  • El tipo de datos MyDateTime utiliza el ensamblado MyAssembly.dll.
  • Crear una tabla cuyo nombre es MyTable.
  • La tabla MyTable contiene los datos del tipo de datos MyDateTime .

Método 1: Usar la utilidad bcp.exe

  1. Utilice la utilidad de Bcp.exe junto con el modificador – n para copiar los datos de la tabla MyTable en un archivo. Por ejemplo, ejecute el comando siguiente en un símbolo del sistema:
    bcp MyDatabase.dbo.MyTable out C:\MyFile.bcp -n –SSQLServerName  -T
  2. En SQL Server Management Studio, siga estos pasos:
    1. Eliminar la tabla MyTable.
    2. Coloque el tipo de datos MyDateTime .
    3. Coloque el ensamblado System.DirectoryServices.dll .
    4. Coloque el ensamblado MyAssembly .
  3. En SQL Server Management Studio, siga estos pasos:
    1. Registrar el ensamblado System.DirectoryServices.dll .
    2. Registrar el ensamblado MyAssembly .
    3. Crear el tipo de datos MyDateTime .
    4. Crear una nueva tabla que tenga la misma estructura de tabla que la tabla MyTable.
  4. Utilice la utilidad de Bcp.exe junto con el modificador – n para importar los datos desde el archivo a la tabla MyTable. Por ejemplo, ejecute el comando siguiente en un símbolo del sistema:
    bcp MyDatabase.dbo.MyTable in C:\MyFile.bcp -n –SSQLServerName  -T

Método 2: Utilizar INSERT... Instrucción SELECT

Se supone que el tipo de datos MyDateTime ocupa 9 bytes de almacenamiento.
  1. En SQL Server Management Studio, cree una nueva tabla que contiene una columna del tipo de datos VARBINARY(9) ejecutando la siguiente instrucción:
    CREATE TABLE TempTable (c1 VARBINARY(9))
  2. Ejecute la siguiente Insertar... Seleccione instrucción para rellenar la tabla TempTable:
    INSERT INTO TempTable SELECT CAST(c1 as VARBINARY(9)) FROM MyTable
  3. En SQL Server Management Studio, siga estos pasos:
    1. Eliminar la tabla MyTable.
    2. Coloque el tipo de datos MyDateTime .
    3. Coloque el ensamblado System.DirectoryServices.dll .
    4. Coloque el ensamblado MyAssembly .
  4. En SQL Server Management Studio, siga estos pasos:
    1. Registrar el ensamblado System.DirectoryServices.dll .
    2. Registrar el ensamblado MyAssembly .
    3. Crear el tipo de datos MyDateTime .
    4. Crear una nueva tabla que tenga la misma estructura de tabla que la tabla MyTable.
  5. Ejecute la siguiente Insertar... Seleccione instrucción para rellenar la tabla MyTable:
    INSERT INTO MyTable SELECT c1 FROM TempTable

Referencias


Para obtener más información acerca de la versión del ensamblado, visite el siguiente sitio Web de Microsoft Developer Network (MSDN):
Para obtener más información acerca de cómo actualizar un ensamblado, visite el siguiente sitio Web de MSDN:
Para obtener más información acerca de cómo quitar un ensamblado, visite el siguiente sitio Web de MSDN:
Para obtener más información acerca de cómo registrar un ensamblado en una base de datos de SQL Server 2005, visite el siguiente sitio Web de MSDN:
Para obtener más información acerca de la utilidad de Bcp.exe, visite el siguiente sitio Web de MSDN: