Message d’erreur lorsque vous exécutez une routine du CLR ou que vous utilisez un assembly dans SQL Server : « l’Assembly dans le magasin hôte a une signature différente à un assembly dans le GAC. (Exception à partir de HRESULT : 0x80131050) »

Symptômes

Examinons les scénarios suivants.

Scénario 1

Vous créez une routine commune language runtime (CLR) qui fait référence à un assembly Microsoft.NET Framework. L’assembly.NET Framework n’est pas documentée dans l’article 922672 de la Base de connaissances. Ensuite, vous installez le 3.5 de.NET Framework ou d’un correctif basée sur.NET Framework 2.0.

Scénario 2

Vous créez un assembly et vous inscrivez ensuite l’assembly dans une base de données Microsoft SQL Server. Ensuite, vous installez une autre version de l’assembly dans le Global Assembly Cache (GAC).

Lorsque vous exécutez la routine CLR ou utilisez l’assembly à partir d’une ou l’autre de ces scénarios dans SQL Server, vous recevez un message d’erreur semblable au suivant :

Serveur : Msg 6522, niveau 16, état 2, ligne 1
Une erreur.NET Framework s’est produite lors de l’exécution de la routine de défini par l’utilisateur ou l’agrégation « getsid' :

System.IO.FileLoadException : N’a pas pu charger fichier ou l’assembly ' System.DirectoryServices, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a' ou une de ses dépendances. L’assembly dans le magasin hôte a une signature différente à un assembly dans le GAC. (Exception à partir de HRESULT : 0x80131050)

System.IO.FileLoadException:

Cause

Lorsque le CLR charge un assembly, le CLR vérifie que le même assembly se trouve dans le GAC. Si le même assembly se trouve dans le GAC, le CLR vérifie que l’ID de Version du Module (MVIDs) de ces assemblys correspondent. Si les MVIDs de ces assemblys ne correspondent pas, vous recevez le message d’erreur qui mentionne de la section « Symptômes ».

Lorsqu’un assembly est recompilé, MVID de l’assembly change. Par conséquent, si vous mettez à jour le.NET Framework, les assemblys.NET Framework ont MVIDs différents parce que ces assemblys sont recompilés. En outre, si vous mettez à jour votre propre assembly, l’assembly est recompilé. Par conséquent, l’assembly possède également un MVID différent.

Solution de contournement

Solution de contournement 1

Pour résoudre le scénario 1 dans la section « Symptômes », vous devez mettre à jour manuellement les assemblys.NET Framework dans SQL Server. Pour ce faire, utilisez l’instruction ALTER ASSEMBLY pour pointer vers la nouvelle version de l’assembly.NET Framework dans le dossier suivant :
%Windir%\Microsoft.NET\Framework\Version
Remarque : Version représente la version de la de.NET Framework que vous avez installé ou mis à jour.

Solution de contournement 2

Pour résoudre le scénario 2 dans la section « Symptômes », utilisez l’instruction ALTER ASSEMBLY pour mettre à jour de l’assembly dans la base de données.

Si le problème persiste après cette opération, supprimer l’assembly de la base de données, puis enregistrez la nouvelle version de l’assembly dans la base de données.

État

Microsoft a confirmé l'existence de ce problème dans les produits Microsoft répertoriés dans la section « S'applique à ».

Plus d'informations

Nous vous déconseillons d’utiliser des assemblys.NET Framework qui ne sont pas documentés dans l’article 922672 de la Base de connaissances. L’article 922672 de la Base de connaissances répertorie les assemblys qui ont été testés dans l’environnement hébergé SQL Server CLR.

Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
Politique de support de 922672 pour les assemblys.NET Framework non testés dans l’environnement hébergé SQL Server CLR

Description de routines CLR

Les routines CLR incluent les objets suivants sont implémentés par l’intégration de SQL Server avec le CLR de.NET Framework :
  • Valeur scalaire définies par l’utilisateur les fonctions scalaires
  • Défini par l’utilisateur les fonctions table (TVF)
  • Procédures définies par l’utilisateur (UDPs)
  • Déclencheurs définis par l’utilisateur
  • Types de données définis par l’utilisateur
  • Agrégats définis par l’utilisateur

Pour mettre à jour une fois que vous installer.NET Framework 3.5, les assemblys

Après avoir installé le 3.5 de.NET Framework, vous devez utiliser l’instruction ALTER ASSEMBLY pour mettre à jour les assemblys suivants :
  • 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
Ces assemblys sont dans le dossier suivant :
%Windir%\Microsoft.NET\Framework\v2.0.50727

Comment faire pour conserver les données à partir de types de données définis par l’utilisateur après avoir déposé un assembly

Si vous supprimez un type de données défini par l’utilisateur à partir de SQL Server utilise un assembly, vous pouvez utiliser une des méthodes suivantes pour conserver les données.

Supposons que Voici le scénario :
  • Vous créez un assembly dont le nom est
    MyAssembly.dll.
  • Les références d’assembly MyAssembly le
    Assemblage System.DirectoryServices.dll .
  • Vous avez un type de données défini par l’utilisateur dont le nom est
    MyDateTime.
  • Le type de données MyDateTime utilise l’assembly MyAssembly.dll.
  • Vous créez une table dont le nom est MyTable.
  • La table MyTable contient les données du type de données MyDateTime .

Méthode 1 : Utilisez l’utilitaire bcp.exe

  1. Pour copier les données de la table MyTable dans un fichier, utilisez l’utilitaire Bcp.exe avec le commutateur – n . Par exemple, exécutez la commande suivante à une invite de commande :
    bcp MyDatabase.dbo.MyTable out C:\MyFile.bcp -n –SSQLServerName  -T
  2. Dans SQL Server Management Studio, procédez comme suit :
    1. Supprimer la table MyTable.
    2. Supprimer le type de données MyDateTime .
    3. Supprimer l’assemblage System.DirectoryServices.dll .
    4. Supprimer l’assembly MyAssembly .
  3. Dans SQL Server Management Studio, procédez comme suit :
    1. Enregistrer l’assemblage System.DirectoryServices.dll .
    2. Enregistrez l’assembly MyAssembly .
    3. Créer le type de données MyDateTime .
    4. Créer une nouvelle table qui possède la même structure de table comme la table MyTable.
  4. Pour importer des données à partir du fichier dans la table MyTable, utilisez l’utilitaire Bcp.exe avec le commutateur – n . Par exemple, exécutez la commande suivante à une invite de commande :
    bcp MyDatabase.dbo.MyTable in C:\MyFile.bcp -n –SSQLServerName  -T

Méthode 2 : Utiliser l’instruction INSERT... Instruction SELECT

Supposons que le type de données MyDateTime occupe 9 octets de stockage.
  1. Dans SQL Server Management Studio, créez une nouvelle table qui contient une colonne du type de données VARBINARY(9) en exécutant l’instruction suivante :
    CREATE TABLE TempTable (c1 VARBINARY(9))
  2. Exécutez la commande suivante INSERT... Sélectionnez instruction pour remplir la table tables temporaires :
    INSERT INTO TempTable SELECT CAST(c1 as VARBINARY(9)) FROM MyTable
  3. Dans SQL Server Management Studio, procédez comme suit :
    1. Supprimer la table MyTable.
    2. Supprimer le type de données MyDateTime .
    3. Supprimer l’assemblage System.DirectoryServices.dll .
    4. Supprimer l’assembly MyAssembly .
  4. Dans SQL Server Management Studio, procédez comme suit :
    1. Enregistrer l’assemblage System.DirectoryServices.dll .
    2. Enregistrez l’assembly MyAssembly .
    3. Créer le type de données MyDateTime .
    4. Créer une nouvelle table qui possède la même structure de table comme la table MyTable.
  5. Exécutez la commande suivante INSERT... Sélectionnez instruction pour remplir la table MyTable :
    INSERT INTO MyTable SELECT c1 FROM TempTable

Références

Pour plus d’informations sur la version de l’assembly, visitez le site Web de Microsoft Developer Network (MSDN) à l’adresse suivante :
Pour plus d’informations sur la façon de mettre à jour un assembly, visitez le site Web MSDN suivant :
Pour plus d’informations sur le déplacement d’un assembly, visitez le site Web MSDN suivant :
Pour plus d’informations sur la façon d’inscrire un assembly dans une base de données SQL Server 2005, visitez le site Web MSDN suivant :
Pour plus d’informations sur l’utilitaire Bcp.exe, visitez le site Web MSDN suivant :
Propriétés

ID d'article : 949080 - Dernière mise à jour : 17 janv. 2017 - Révision : 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

Commentaires