Message d'erreur lorsque vous utilisez un objet runtime langage commun dans SQL Server 2005: « Impossible de charger assembly de sérialisation générée dynamiquement »

Traductions disponibles Traductions disponibles
Numéro d'article: 913668 - Voir les produits auxquels s'applique cet article
Bogue #: 101935 (SQLBUDT)
Agrandir tout | Réduire tout

Sommaire

Symptômes

Lorsque vous utilisez un objet de runtime (CLR) langage courantes dans Microsoft SQL Server 2005, un message d'erreur est semblable à la suivante peut s'afficher :
Msg 6522, Niveau 16, État 2, ligne 1
Une erreur de .NET Framework s'est produite pendant l'exécution de routine définies par l'utilisateur ou de regroupement « NomObjet » :
System.InvalidOperationException : ne peut pas charger l'assembly de sérialisation générée dynamiquement. Dans un assembly environnements d'hébergement fonctionnalité charge est limitée, envisagez l'utilisation de sérialiseur prégénérée. Consultez l'exception interne pour plus d'informations. ---> System.IO.FileLoadException : LoadFrom(), de LoadFile(), de Load(byte[]) et de LoadModule() ont été désactivés par le ordinateur hôte.
System.IO.FileLoadException :
à System.Reflection.Assembly.nLoadImage (octet rawAssembly [], octets rawSymbolStore [], preuves preuves, StackCrawlMark & stackMark, fIntrospection Boolean)
à System.Reflection.Assembly.Load (Byte [] rawAssembly Byte [] rawSymbolStore, preuves securityEvidence)
à Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch (CompilerParameters options, noms de fichier chaîne [])
à Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch(CompilerParameters options, String[] sources)
à Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch(CompilerParameters options, String[] sources)
à System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource(CompilerParameters options, String[] s
...
System.InvalidOperationException :
à System.Xml.Serialization.Compiler.Compile (parent de l'assembly chaîne ns paramètres CompilerParameters, preuves preuves)
à System.Xml.Serialization.TempAssembly.GenerateAssembly (XmlMapping [] xmlMappings, les type [] types, defaultNamespace de type String, preuves de preuves, paramètres CompilerParameters, assembly assembly, assemblys Hashtable)
à System.Xml.Serialization.TempAssemblyctor (XmlMapping [] xmlMappings, les type [] types, chaîne defaultNamespace, emplacement de type String, preuves preuves)
à System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping, Type type, String defaultNamespace)
à System.Xml.Serialization.XmlSerializerctor(Type type, String defaultNamespace)
à System.Xml.Serialization.XmlSe...
Par exemple, vous pouvez recevoir le message d'erreur lorsque vous utilisez un objet CLR qui appelle un service Web ou effectue la conversion de types définis par l'utilisateur au format XML dans SQL Server.

Cause

Ce problème se produit lorsqu'un objet CLR est converti au XML type de données. Quand se cette conversion produit, Windows Communication Foundation (nom de code antérieur « Indigo ») essaie d'effectuez l'une des opérations suivantes :
  • Générer un nouvel assembly de sérialisation XML.
  • Enregistrer l'assembly sur le disque.
  • Charger l'assembly dans le domaine d'application en cours.
Toutefois, SQL Server n'autorise pas à ce type d'accès au disque dans le CLR de SQL pour des raisons de sécurité. Par conséquent, vous recevez le message d'erreur qui est mentionné dans la section « Symptômes ». Plusieurs scénarios peuvent entraîner l'objet CLR pour être convertie dans le type de données XML.

Pour plus d'informations sur l'initiative Windows Communication Foundation, reportez-vous au site de Web MSDN (Microsoft Developer Network) suivant :
http://msdn2.microsoft.com/en-us/library/ms735119.aspx
Vous pouvez recevoir le message d'erreur qui est mentionné dans la section « Symptômes » dans les scénarios suivants :
  • Le code CLR qui implémente des objets CLR explicitement utilise la classe XmlSerializer . Ces objets CLR peuvent inclure procédures stockées, fonctions, types définis par l'utilisateur, les agrégats et les déclencheurs.
  • Vous utiliser un service Web dans le code CLR.
  • Vous envoyer ou recevoir des objets CLR vers ou à partir de SQL Server en utilisant un accès HTTP/SOAP direct à SQL Server.
  • L'objet CLR convertit un type défini par l'utilisateur le type de données XML.

Résolution

Pour résoudre ce problème, vous devez utiliser l'outil de génération de sérialiseur XML (Sgen.exe) pour créer l'assembly de sérialisation XML pour l'assembly d'origine manuellement. Ensuite, charger les assemblys dans SQL Server base de données.

Exemple de code

For example, you may want to create a CLR function that returns XML data by using an assembly that is created by the following code example:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;   
using System.Xml;
using System.Xml.Serialization;
using System.Text;
using System.IO;
public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static  SqlString XMLTest()
    {
        Person p = new Person();
        return new SqlString(p.GetXml());
        
    }
    public class Person
    { 
        public String m_FirstName = "Jane";
        public String m_LastName = "Dow";

        public String GetXml()
        {
          XmlSerializer ser = new XmlSerializer(typeof(Person));
          StringBuilder sb = new StringBuilder();
          StringWriter wr = new StringWriter(sb);
            ser.Serialize(wr, this);

            return sb.ToString();
        }

    }
}
When you call the XMLTest function in SQL Server Management Studio, you expect to receive the following result:
<?xml version="1.0" encoding="utf-16"?>
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<m_FirstName>Jane</m_FirstName>
<m_LastName>Dow</m_LastName>  
</Person>
Pour renvoyer le résultat correct, vous devez créer manuellement le XML assembly de sérialisation pour l'assembly d'origine. Utiliser une des méthodes suivantes pour créer l'assembly de sérialisation manuellement.

note Ces méthodes supposent que les conditions suivantes sont vraie :
  • Vous avez créé une base de données dbTest dans une instance de SQL Server 2005.
  • Tous les fichiers de projet sont enregistrés dans le C:\CLRTest dossier.

Méthode 1: créer un projet de SQL Server CLR à l'aide de Microsoft Visual Studio 2005

Vous pouvez créer l'assembly de sérialisation via l'option Générer les événements dans Visual Studio 2005. Pour ce faire, procédez comme suit :
  1. Démarrez Visual Studio 2005.
  2. Créez un nouveau projet SQL Server appelée MyTest.
  3. Dans la boîte de dialogue Ajouter une référence , cliquez sur la référence qui se connecte à la base de données dbTest , puis cliquez sur OK .

    Si la référence n'est pas dans la liste, vous devez créer une nouvelle référence. Pour ce faire, cliquez sur Ajouter une nouvelle référence .
  4. Dans le menu projet , cliquez sur Ajouter fonction défini par l'utilisateur . La boîte de dialogue Ajouter un nouvel élément s'affiche.
  5. Cliquez sur Ajouter pour ajouter un nouveau fichier. Par défaut, le fichier est nommé Function1.cs.

    note Vous recevez le message d'erreur mentionné dans les « symptômes » de section si vous déployer le projet dans la base de données et puis exécutez l'instruction Transact-SQL suivante :
    SELECT [dbTest].[dbo].[XMLTest] ()
    vous devez suivre les étapes 6-16 pour résoudre ce problème.
  6. Ajoutez le code est répertorié dans la section « exemple de code » dans le fichier Function1.cs.
  7. Dans le menu projet , cliquez sur MyTest propriétés .
  8. Dans la boîte de dialogue MyTest , cliquez sur l'option Générer les événements .
  9. Tapez la commande suivante dans la zone Post-build ligne de commande de l'événement :
    C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sgen.exe "/force" $ (TargetPath)
    note l'option/force génère un nouvel assembly de sérialisation chaque fois que vous modifiez l'assembly de source. En outre, vous devez modifier cette commande si vous avez installé Visual Studio 2005 dans un autre dossier.
  10. Dans le dossier C:\CLRTest, créer deux fichiers texte nommés Predeployscript.sql et Postdeployscript.sql.
  11. Ajoutez les instructions Transact-SQL suivantes au fichier Predeployscript.sql :
    IF EXISTS (SELECT [name] FROM sys.assemblies WHERE [name] = N'MyTest.XmlSerializers') 
    	DROP ASSEMBLY [MyTest.XmlSerializers]
    
  12. Ajoutez les instructions Transact-SQL suivantes au fichier Postdeployscript.sql :
    CREATE ASSEMBLY [MyTest.XmlSerializers] from
    'C:\CLRTest\MyTest\MyTest\bin\Debug\MyTest.XmlSerializers.dll'
    WITH permission_set = SAFE
    
  13. Dans le menu projet , cliquez sur Ajouter existant article .
  14. Dans la boîte de dialogue Ajouter un élément existant , recherchez le dossier C:\CLRTest, puis cliquez sur tous les fichiers (*. *) dans la liste type de fichier .
  15. Dans la zone Nom de fichier , tapez Postdeployscript.sql;Predeployscript.sql et puis cliquez sur OK .
  16. Dans le menu Générer , cliquez sur déployer MyTest .
  17. Exécutez l'instruction Transact-SQL suivante dans SQL Server Management Studio :
    SELECT [dbTest].[dbo].[XMLTest] ()
    vous recevez le résultat correct.

Méthode 2: créer un projet SQL CLR à la fenêtre d'invite de commande Visual Studio

  1. Recherchez le dossier C:\CLRTest.
  2. Créez un fichier texte nommé MyTest.cs.
  3. Ajoutez le code est répertorié dans la section « exemple de code » dans le fichier MyTest.cs.
  4. Ouvrez la fenêtre d'invite de commande Visual Studio 2005.
  5. Tapez CD C:\CLRTest et puis appuyez sur ENTRÉE.
  6. Tapez csc /t:library MyTest.cs et puis appuyez sur ENTRÉE.
  7. Tapez sgen.exe /force MyTest.dll et puis appuyez sur ENTRÉE.
  8. Exécutez les instructions Transact-SQL suivantes dans SQL Server Management Studio :
    USE dbTest
    GO
    CREATE ASSEMBLY [MyTest] from 'C:\CLRTest\MyTest.dll'
    GO
    CREATE ASSEMBLY [MyTest.XmlSerializers.dll] from 'C:\CLRTest\MyTest.XmlSerializers.dll'
    GO
    
    CREATE FUNCTION XMLTest()
    RETURNS nvarchar (max)
    AS
    EXTERNAL NAME MyTest.StoredProcedures.XMLTest
    GO
  9. Exécutez l'instruction Transact-SQL suivante dans SQL Server Management Studio :
    SELECT [dbTest].[dbo].[XMLTest] ()
    vous recevez le résultat correct.

Si vous utilisez un assembly principal qui fait référence autres assemblys, vous devez générer des assemblys de sérialisation XML pour tous les assemblys qui sont référencés par l'assembly principal. Ensuite, vous devez charger ces assemblys de sérialisation XML dans la base de données SQL Server en utilisant l'instruction CREATE ASSEMBLAGE.

Statut

Ce comportement est voulu par la conception même du produit.

Références

Pour plus d'informations sur de sérialisation XML CLR objets de base de données, reportez-vous au site Web MSDN suivant adresse :
http://msdn2.microsoft.com/en-us/library/ms131088.aspx
Pour plus d'informations sur l'outil de génération de sérialiseur XML, reportez-vous au site Web MSDN suivant :
http://msdn2.microsoft.com/en-us/library/bk3w6240.aspx

Propriétés

Numéro d'article: 913668 - Dernière mise à jour: mercredi 23 mai 2007 - Version: 2.1
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL Server 2005 Workgroup Edition
Mots-clés : 
kbmt kbsql2005clr kbexpertiseadvanced kbprb KB913668 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 913668
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com