Messaggio di errore quando si utilizza un oggetto common language runtime in SQL Server 2005: "Impossibile caricare l'assembly di serializzazione generato dinamicamente"

Bug #: 101935 (SQLBUDT)

Sintomi

Quando si utilizza un oggetto di common language runtime (CLR) in Microsoft SQL Server 2005, si potrebbe ricevere un messaggio di errore analogo al seguente:

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 aggregata 'nomeoggetto':
System. InvalidOperationException: Impossibile caricare l'assembly di serializzazione generato dinamicamente. Alcuni assembly ambienti hosting la funzionalità di carico è limitata, è possibile utilizzare pregenerato. Vedere l'eccezione interna per ulteriori informazioni. ---> System.IO.FileLoadException: LoadFrom (), LoadFile, Load(byte[]) e LoadModule () sono stati disattivati dall'host.
System.IO.FileLoadException:

in System.Reflection.Assembly.nLoadImage (Byte [] rawAssembly, Byte [] rawSymbolStore, la prova di evidenza, StackCrawlMark & stackMark, fIntrospection Boolean)
in Load (Byte [] rawAssembly, Byte [] rawSymbolStore, prove securityEvidence)
in Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch (CompilerParameters opzioni, nomi di file String [])
in Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch (opzioni CompilerParameters, origini di String [])
in Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch (opzioni CompilerParameters, origini di String [])
in System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource (opzioni CompilerParameters, String [] s
...
System.InvalidOperationException:
in System.Xml.Serialization.Compiler.Compile (padre di Assembly, stringa ns, parametri CompilerParameters, prova evidence)
in System.Xml.Serialization.TempAssembly.GenerateAssembly (XmlMapping [] xmlMappings, tipi di tipo [], stringa defaultNamespace, prova evidence, CompilerParameters parametri, Assembly assembly, assembly Hashtable)
in System.Xml.Serialization.TempAssembly... costruttore (XmlMapping [] xmlMappings, tipi di tipo [], String defaultNamespace, percorso di stringa, prova evidence)
in System.Xml.Serialization.XmlSerializer.GenerateTempAssembly (XmlMapping xmlMapping, tipo, defaultNamespace stringa)
in corrispondenza di XmlSerializer.. costruttore (tipo, defaultNamespace stringa)
in System.Xml.Serialization.XmlSe...

Ad esempio, che venga visualizzato il messaggio di errore quando si utilizza un oggetto CLR che chiama un servizio Web o esegue la conversione da tipi definiti dall'utente in formato XML all'interno di SQL Server.

Causa

Questo problema si verifica quando un oggetto CLR viene convertito nel tipo di dati XML. Quando si verifica questa conversione, Windows Communication Foundation (precedentemente noto con il nome in codice "Indigo") tenta di eseguire le operazioni seguenti:

  • Generare un nuovo assembly di serializzazione XML.

  • Salvare l'assembly su disco.

  • Caricare l'assembly nel dominio applicazione corrente.

SQL Server non consente, tuttavia, per questo tipo di accesso al disco in CLR SQL per motivi di sicurezza. Di conseguenza, viene visualizzato il messaggio di errore menzionato nella sezione "Sintomi". Diversi scenari possono causare l'oggetto CLR da convertire nel tipo di dati XML.

Per ulteriori informazioni su Windows Communication Foundation, visitare il seguente sito Web Microsoft Developer Network (MSDN):

http://msdn2.microsoft.com/en-us/library/ms735119.aspxVenga visualizzato il messaggio di errore menzionato nella sezione "Sintomi" nei seguenti scenari:

  • Il codice CLR che implementa in modo esplicito gli oggetti CLR utilizza la classe XmlSerializer . Questi oggetti CLR possono includere trigger, aggregazioni, tipi definiti dall'utente, funzioni e stored procedure.

  • Utilizzare un servizio Web nel codice CLR.

  • Inviare o ricevere oggetti CLR da SQL Server utilizzando l'accesso HTTP/SOAP diretto a SQL Server.

  • L'oggetto CLR converte un tipo definito dall'utente per il tipo di dati XML.

Risoluzione

Per risolvere questo problema, è necessario utilizzare lo strumento di generazione di serializzatori XML (Sgen.exe) per creare l'assembly di serializzazione XML per l'assembly originale manualmente. Quindi, caricare gli assembly in un database di SQL Server.

Esempio di codice

Ad esempio, si consiglia di creare una funzione CLR che restituisce dati XML utilizzando un assembly creato dall'esempio di codice riportato di seguito:

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();
}

}
}

Quando si chiama la funzione XMLTest in SQL Server Management Studio, si prevede di ricevere il seguente risultato:

<?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>

Per restituire il risultato corretto, è necessario creare manualmente l'assembly di serializzazione XML per l'assembly originale. Utilizzare uno dei seguenti metodi per creare manualmente l'assembly di serializzazione.

Nota: Questi metodi presuppongono che le seguenti condizioni sono vere:

  • È stato creato un database dbTest in un'istanza di SQL Server 2005.

  • Tutti i file di progetto vengono salvati nella cartella C:\CLRTest.

Metodo 1: Creare un progetto CLR SQL Server utilizzando Microsoft Visual Studio 2005

Utilizzando l'opzione di Eventi di compilazione Microsoft Visual Studio 2005, è possibile creare assembly di serializzazione. A tale scopo, attenersi alla seguente procedura:

  1. Avviare Visual Studio 2005.

  2. Creare un nuovo progetto di SQL Server denominata MyTest.

  3. Nella finestra di dialogo Aggiungi riferimento al Database , fare clic sul riferimento che si connette al database dbTest e quindi fare clic su OK.

    Se il riferimento non è presente nell'elenco, è necessario creare un nuovo riferimento. A tale scopo, fare clic su Aggiungi nuovo riferimento.

  4. Dal menu progetto , fare clic su Aggiungi funzione. Verrà visualizzata la finestra di dialogo Aggiungi nuovo elemento .

  5. Fare clic su Aggiungi per aggiungere un nuovo file. Per impostazione predefinita, il file è denominato Function1.cs.

    Nota: Viene visualizzato il messaggio di errore menzionato nella sezione "Sintomi" Se si distribuisce il progetto al database e quindi eseguire l'istruzione Transact-SQL seguente:

    SELECT [dbTest].[dbo].[XMLTest] ()

    È necessario seguire i passaggi da 6 a 16 per risolvere il problema.

  6. Aggiungere il codice elencato nella sezione "Esempio" per il file Function1.cs.

  7. Dal menu progetto , fare clic su Proprietà MyTest.

  8. Nella finestra di dialogo MyTest , scegliere il
    Opzione di Eventi di compilazione .

  9. Digitare il seguente comando nella casella riga di comando eventi post-compilazione :

    "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sgen.exe" force "$(TargetPath)"Nota: L'opzione /force genera un assembly di serializzazione di nuovo ogni volta che si modifica l'assembly di origine. Inoltre, è necessario modificare questo comando se è installato Visual Studio 2005 in un'altra cartella.

  10. Nella cartella C:\CLRTest, creare due file di testo denominati PreDeployScript e PostDeployScript.

  11. Aggiungere le istruzioni Transact-SQL seguenti al file PreDeployScript:

    IF EXISTS (SELECT [name] FROM sys.assemblies WHERE [name] = N'MyTest.XmlSerializers') 
    DROP ASSEMBLY [MyTest.XmlSerializers]
  12. Aggiungere le istruzioni Transact-SQL seguenti al file PostDeployScript:

    CREATE ASSEMBLY [MyTest.XmlSerializers] from
    'C:\CLRTest\MyTest\MyTest\bin\Debug\MyTest.XmlSerializers.dll'
    WITH permission_set = SAFE
  13. Scegliere Aggiungi elemento esistentedal menu progetto .

  14. Nella finestra di dialogo Aggiungi elemento esistente , individuare la cartella C:\CLRTest e quindi fare clic su tutti i file (*. *)nell'elenco tipo file .

  15. Nella casella Nome File , digitare
    PostDeployScript ; PreDeployScript, quindi fare clic su
    OK.

  16. Dal menu Compila , fare clic su Distribuire MyTest.

  17. Eseguire la seguente istruzione Transact-SQL in SQL Server Management Studio:

    SELECT [dbTest].[dbo].[XMLTest] ()

    Viene visualizzato il risultato corretto.

Metodo 2: Creare un progetto CLR SQL nella finestra del Prompt dei comandi di Visual Studio

  1. Individuare la cartella C:\CLRTest.

  2. Creare un file di testo denominato MyTest.cs.

  3. Aggiungere il codice elencato nella sezione "Esempio" per il file MyTest.cs.

  4. Aprire la finestra del Prompt dei comandi di Visual Studio 2005.

  5. Digitare CD C:\CLRTeste quindi premere INVIO.

  6. Digitare csc /t: library MyTest.cse quindi premere INVIO.

  7. Digitare sgen.exe /force myTest. dlle quindi premere INVIO.

  8. Eseguire le seguenti istruzioni Transact-SQL in 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. Eseguire la seguente istruzione Transact-SQL in SQL Server Management Studio:

    SELECT [dbTest].[dbo].[XMLTest] ()

    Viene visualizzato il risultato corretto.


Se si utilizza un assembly principale che fa riferimento ad altri assembly, è necessario generare assembly di serializzazione XML per tutti gli assembly a cui fanno riferimento l'assembly principale. Quindi, è necessario caricare gli assembly di serializzazione XML nel database di SQL Server utilizzando l'istruzione CREATE ASSEMBLY.

Stato

Questo è il comportamento previsto.

Riferimenti

Per ulteriori informazioni sulla serializzazione XML di oggetti database CLR, visitare il seguente sito Web MSDN:

http://msdn2.microsoft.com/en-us/library/ms131088.aspxPer ulteriori informazioni sullo strumento di generazione di serializzatori XML, visitare il seguente sito Web MSDN:

http://msdn2.microsoft.com/en-us/library/bk3w6240.aspx

Serve aiuto?

Amplia le tue competenze
Esplora i corsi di formazione
Ottieni in anticipo le nuove caratteristiche
Partecipa a Microsoft Insider

Queste informazioni sono risultate utili?

Grazie per il feedback!

Grazie per il tuo feedback! Potrebbe essere utile metterti in contatto con uno dei nostri operatori del supporto di Office.

×