Comment faire pour mettre à niveau ou déclasser un assembly qui a un assembly référencé pour un objet CLR dans une instance de SQL Server 2005


Bogue : 490 (correctif SQL)

Résumé


Lorsque vous essayez de mettre à niveau ou déclasser un assemblage pour un objet du common language runtime (CLR) dans une instance de Microsoft SQL Server 2005, vous ne pouvez pas modifier la version des assemblys référencés dans les métadonnées de l’assembly. En outre, si vous utilisez un assembly avec nom fort pour un objet CLR, vous ne peut pas rétrograder l’assembly à l’aide de l’instruction ALTER ASSEMBLY.

INTRODUCTION


Cet article décrit comment mettre à niveau ou déclasser un assembly qui a un assembly référencé pour un objet CLR dans une instance de SQL Server 2005.

Plus d'informations


Comment faire pour mettre à niveau ou déclasser un assembly

Dans SQL Server 2005, vous pouvez utiliser l’instruction ALTER ASSEMBLY pour mettre à niveau ou déclasser un assembly autonome qui n’a pas été créé avec un nom fort. Pour un assembly avec nom fort, vous pouvez mettre à niveau, mais ne peut pas mettre à niveau l’assembly à l’aide de l’instruction ALTER ASSEMBLY.

Vous ne pouvez pas promouvoir ou rétrograder un assembly dans le scénario suivant :
  • L’assembly A est créé pour un objet CLR dans une instance. Cet assembly A a un assembly référencé. L’assembly référencé est B.
  • L’assembly B n’a aucun assembly référencé.
  • Vous recompilez l’assembly A pour faire référence à une autre version de l’assembly B.
Dans ce scénario, vous pouvez utiliser l’instruction ALTER ASSEMBLY mise à niveau vers une nouvelle version de l’assembly B. Si l’assembly B n’est pas un assembly avec nom fort, vous pouvez également configurer un assembly B à une ancienne version. Toutefois, vous ne pouvez pas utiliser l’instruction ALTER ASSEMBLY pour mettre à niveau ou déclasser un assembly vers la version recompilée.

Ce problème se produit parce que SQL Server crée une stratégie de fusion CLR lorsque vous créez l’assembly A. Cette stratégie de fusion CLR mappe automatiquement la version de l’assembly B dans les métadonnées de l’assembly Qu'a à la version de l’assembly B. SQL Server charge de la nouvelle version de l’assembly B au moment de l’exécution lorsque vous mettez à niveau ou déclasser l’assembly B à une autre version. Ce problème se produit même si l’assembly A fait référence à la version d’origine de l’assembly B. Toutefois, lorsque vous essayez de promouvoir ou rétrograder un d’assembly lorsque l’assembly A contient une nouvelle version de l’assembly B dans les métadonnées, l’instruction ALTER ASSEMBLY échoue et vous recevez des messages d’erreur semblables aux suivants :
Message d'erreur 1
Msg 6529, niveau 16, état 1, ligne 1

Échec de ALTER ASSEMBLY parce que l’identité de l’assembly référencé 'RefAsm' a été modifié. Assurez-vous que la version, le nom et la clé publique n’ont pas changé.
Message d'erreur 2
Msg 6282, niveau 16, état 1, ligne 1

Échec de ALTER ASSEMBLY parce que les assemblys référencés pourraient changer. La liste de l’assembly référencé doit rester le même.

Mise à niveau ou déclasser l’assembly

Remarques
  • Ces étapes de mise à niveau ou déclassement un assembly dans le scénario décrit dans la section « Comment faire mettre à niveau ou déclasser un assembly ».
  • Cet exemple suppose que les versions des deux assemblys sont à la fois 1.0.0.0 et les assemblys sont tous deux écrits en C#. Lorsque vous suivez ces étapes, vous essayez de mise à niveau de l’assembly A et assembly B vers la version 2.0.0.0.
Pour mettre à niveau ou déclasser l’assembly A, procédez comme suit.
  1. Sauvegarder la version 1.0.0.0 de l’assembly B dans un dossier.
  2. Modifier, puis recompilez l’assembly B à la version 2.0.0.0.
  3. Utilisez l’instruction ALTER ASSEMBLY pour mettre à niveau de l’assembly B dans SQL Server 2005.
  4. Modifier, puis recompilez l’assembly A à la version 2.0.0.0. Lorsque vous effectuez cette référence la version 1.0.0.0 de l’assembly B à partir de la sauvegarde que vous avez apportées à l’étape 1. Pour ce faire, utilisez l’outil de compilateur Csc.exe avec le commutateur /reference . Par exemple, utilisez la commande suivante :
    csc/target : library/out :AssemblyA.dll AssemblyA.cs AssemblyInfo.cs /reference : »BackupFolder\AssemblyB.dll »
    Remarque Pour vérifier la version de l’assembly B dans les métadonnées de l’assembly A, ouvrez l’assembly A à l’aide de l’utilitaire Ildasm.exe. Ensuite, vérifiez les informations de métadonnées pour l’assembly référencé dans la section du manifeste .
  5. Utilisez l’instruction ALTER ASSEMBLY pour mettre à niveau d’un assembly dans SQL Server 2005.

Comment déclasser un assembly avec nom fort

Si vous utilisez un assembly avec nom fort pour un objet CLR, SQL Server 2005 n’autorise pas de déclasser les assemblys à l’aide de l’instruction ALTER ASSEMBLY. Si vous essayez de mettre à niveau la version d’un assembly à l’aide de l’instruction ALTER ASSEMBLY, vous recevez un message d’erreur semblable au suivant :
Msg 6579, niveau 16, état 1, ligne 1
ALTER assembly ' Asm1, version = 1.1.0.0, culture = neutral, publickeytoken = 3a52b896cff0513d, processorarchitecture = msil' à ' Asm1, version = 1.0.0.0, culture = neutral, publickeytoken = 3a52b896cff0513d, processorarchitecture = msil' n’est pas un mise à niveau compatible.
Lorsque vous souhaitez mettre à niveau d’un assembly avec nom fort, procédez comme suit :
  1. Supprimer tous les objets qui dépendent de l’assembly.
  2. Supprimer la version plus récente de l’assembly.
  3. Créer l’ancienne version de l’assembly.
  4. Créer tous les objets requis qui dépendent de l’assembly.
Remarque Vous pouvez mettre à niveau un assembly avec nom fort à l’aide de l’instruction ALTER ASSEMBLY. Toutefois, si la mise à niveau implique un assembly référencé, vous devez suivre les mêmes étapes répertoriées dans la section « Mise à niveau ou déclasser un assembly ».

Références


Pour plus d’informations sur l’instruction ALTER ASSEMBLY, visitez le site Web de Microsoft Developer Network (MSDN) à l’adresse suivante :Pour plus d’informations sur l’utilitaire Ildasm.exe, visitez le site Web MSDN suivant :