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

Traduzione articoli Traduzione articoli
Identificativo articolo: 913668 - Visualizza i prodotti a cui si riferisce l?articolo.
Bug #: 101935 (SQLBUDT)
Espandi tutto | Chiudi tutto

In questa pagina

Sintomi

Quando si utilizza oggetto common language runtime (CLR) in Microsoft SQL Server 2005, Ŕ possibile che venga visualizzato un messaggio di errore analogo al seguente:
Msg 6522, livello 16, 2, stato 1
Si Ŕ verificato un errore di .NET Framework durante l'esecuzione di routine definite dall'utente o di aggregata 'nomeoggetto':
System.InvalidOperationException: Impossibile caricare l'assembly di serializzazione generato dinamicamente. In un assembly di ambienti di hosting la funzionalitÓ di carico Ŕ limitato, Ŕ consigliabile utilizzare serializzatore generati in precedenza. Vedere l'eccezione interna per ulteriori informazioni. ---> System.IO.FileLoadException: LoadFrom(), LoadFile(), Load(byte[]) e LoadModule() sono disabilitati per l'host.
System.IO.FileLoadException:
in System.Reflection.Assembly.nLoadImage (byte rawAssembly [], byte rawSymbolStore [], prova prova, StackCrawlMark & stackMark, fIntrospection Boolean)
in System.Reflection.assembly.Load (byte [] rawAssembly, byte [] rawSymbolStore, prove securityEvidence)
in Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch (CompilerParameters opzioni, nomi di file String [])
in Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch(CompilerParameters options, String[] sources)
in Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch(CompilerParameters options, String[] sources)
in System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource(CompilerParameters options, String[] s
...
System.InvalidOperationException:
in System.Xml.Serialization.Compiler.Compile (assembly padre, String ns, parametri CompilerParameters, prova evidence)
in System.Xml.Serialization.TempAssembly.GenerateAssembly (poi xmlMappings di [], Type [] types, defaultNamespace String, prova evidence, CompilerParameters parametri, assembly assembly, assembly Hashtable)
in System.Xml.Serialization.TempAssemblycostruttore (poi xmlMappings di [], Type [] types, defaultNamespace String, String posizione, prova evidence)
in System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping, Type type, String defaultNamespace)
in System.Xml.Serialization.XmlSerializerctor(Type Type, String defaultNamespace)
in System.Xml.Serialization.XmlSe in corso...
Ad esempio, potresti ricevere il messaggio di errore quando si utilizza un oggetto CLR chiama un servizio Web che esegue la conversione dai tipi definiti dall'utente in formato XML all'interno di SQL Server.

Cause

Questo problema si verifica quando il codice XML viene convertito in un oggetto CLR tipo di dati. Quando si verifica di questa conversione, Windows Communication Foundation (nome in codice precedente "Indigo") tenta di eseguire le operazioni seguenti:
  • Consente di generare un nuovo assembly di serializzazione XML.
  • Salvare l'assembly su disco.
  • Caricare l'assembly nel dominio applicazione corrente.
Tuttavia, SQL Server non Ŕ consentito per questo tipo di accesso al disco in CLR SQL per motivi di protezione. Di conseguenza, Ŕ visualizzato il messaggio di errore menzionato nella sezione "Sintomi". Diversi scenari potrebbero causare l'oggetto CLR da convertire il tipo di dati XML.

Per ulteriori informazioni su Windows Communication Foundation, visitare il seguente sito Web MSDN (informazioni in lingua inglese):
http://msdn2.microsoft.com/en-us/library/ms735119.aspx
Si potrebbe essere 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 le stored procedure, funzioni, tipi definiti dall'utente, aggregati e trigger.
  • ╚ possibile utilizzare un servizio Web nel codice di CLR.
  • Inviati o ricevuti gli oggetti CLR da SQL Server utilizzando l'accesso diretto di HTTP/SOAP a SQL Server.
  • L'oggetto CLR converte un tipo definito dall'utente nel tipo di dati XML.

Risoluzione

Per risolvere il problema, occorre utilizzare lo strumento XML Serializer Generator (Sgen.exe) per creare l'assembly di serializzazione XML per l'assembly originale manualmente. Quindi, caricare gli assembly in un SQL Server database.

Esempio di codice

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>
per restituire il risultato corretto, Ŕ necessario creare manualmente il codice XML assembly di serializzazione per l'assembly originale. Utilizzare uno dei seguenti metodi per creare manualmente l'assembly di serializzazione.

Nota Questi metodi assunto che le seguenti condizioni sono true:
  • ╚ stato creato un database dbTest in un'istanza di SQL Server 2005.
  • Tutti i file di progetto vengono salvati in C:\CLRTest la cartella.

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

╚ possibile creare l'assembly di serializzazione tramite l'opzione di Eventi di generazione in Microsoft Visual Studio 2005. Per effettuare questa operazione, attenersi alla seguente procedura:
  1. Avviare Visual Studio 2005.
  2. Creare un nuovo progetto SQL Server denominata MyTest.
  3. Nella finestra di dialogo Aggiungi riferimento al database , fare clic su riferimento che si connette al database dbTest e scegliere OK .

    Se il riferimento non Ŕ nell'elenco, Ŕ necessario creare un nuovo riferimento. Per effettuare questa operazione, fare clic su Aggiungi nuovo riferimento .
  4. Scegliere dal menu progetto , Aggiungi funzione definita dall'utente . 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 ╚ visualizzato il messaggio di errore menzionato nella sezione "Sintomi" sezione se si distribuisce il progetto al database e si esegue quindi la seguente istruzione:
    SELECT [dbTest].[dbo].[XMLTest] ()
    Ŕ necessario eseguire i passaggi 6-16 per risolvere il problema.
  6. Aggiungere il codice che Ŕ elencato nella sezione "Esempio di codice" nel file Function1.cs.
  7. Scegliere dal menu progetto , MyTest proprietÓ .
  8. Nella finestra di dialogo MyTest , scegliere l'opzione Genera eventi .
  9. Digitare il seguente comando nella casella riga di comando evento di post-generazione :
    "C:\Programmi\Microsoft Visual Studio 8\SDK\v2.0\Bin\sgen.exe"/force"$ (TargetPath)"
    Nota L'opzione/force genera un nuovo assembly di serializzazione ogni volta che Ŕ modificare 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 sono denominate Predeployscript.sql e Postdeployscript.sql.
  11. Aggiungere le seguenti istruzioni Transact-SQL al file Predeployscript.sql:
    IF EXISTS (SELECT [name] FROM sys.assemblies WHERE [name] = N'MyTest.XmlSerializers') 
    	DROP ASSEMBLY [MyTest.XmlSerializers]
    
  12. Aggiungere le seguenti istruzioni Transact-SQL al file Postdeployscript.sql:
    CREATE ASSEMBLY [MyTest.XmlSerializers] from
    'C:\CLRTest\MyTest\MyTest\bin\Debug\MyTest.XmlSerializers.dll'
    WITH permission_set = SAFE
    
  13. Nel menu progetto , fare clic su Aggiungi esistente elemento .
  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.sql;Predeployscript.sql e quindi fare clic su OK .
  16. Scegliere dal menu Genera , distribuzione MyTest .
  17. Eseguire la seguente istruzione di Transact-SQL in SQL Server Management Studio:
    SELECT [dbTest].[dbo].[XMLTest] ()
    Ŕ visualizzato il risultato corretto.

Metodo 2: Genera 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 che Ŕ elencato nella sezione "Esempio di codice" nel file MyTest.cs.
  4. Aprire la finestra del prompt dei comandi di Visual Studio 2005.
  5. Digitare CD C:\CLRTest e quindi premere INVIO.
  6. Digitare csc /t:library MyTest.cs e quindi premere INVIO.
  7. Digitare sgen.exe /force MyTest.dll e 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 di Transact-SQL in SQL Server Management Studio:
    SELECT [dbTest].[dbo].[XMLTest] ()
    Ŕ visualizzato il risultato corretto.

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

Status

Questo comportamento legato alla progettazione.

Riferimenti

Per ulteriori informazioni sulla serializzazione XML da CLR oggetti di database, visitare il seguente sito Web MSDN:
http://msdn2.microsoft.com/en-us/library/ms131088.aspx
Per ulteriori informazioni sullo strumento XML Serializer Generator, visitare il seguente sito Web MSDN:
http://msdn2.microsoft.com/en-us/library/bk3w6240.aspx

ProprietÓ

Identificativo articolo: 913668 - Ultima modifica: mercoledý 23 maggio 2007 - Revisione: 2.1
Le informazioni in questo articolo si applicano a:
  • 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
Chiavi:á
kbmt kbsql2005clr kbexpertiseadvanced kbprb KB913668 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 913668
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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