Mensaje de error cuando utiliza un objeto de common language runtime en SQL Server 2005: "No se puede cargar el ensamblado de serialización generado dinámicamente"

Seleccione idioma Seleccione idioma
Id. de artículo: 913668 - Ver los productos a los que se aplica este artículo
Nº de error: 101935 (SQLBUDT)
Expandir todo | Contraer todo

En esta página

Síntomas

Cuando utiliza un objeto de common language runtime (CLR) en Microsoft SQL Server 2005, puede recibir un mensaje de error que es similar al siguiente:
Msj 6522, nivel 16, estado 2, línea 1
Error de .NET Framework durante la ejecución de rutina de definido por el usuario o agregado 'ObjectName':
System.InvalidOperationException: No se puede cargar el ensamblado de serialización generado dinámicamente. En algunos ensamblado de entornos de alojamiento funcionalidad de carga está restringida, considere utilizar serializador pregenerada. Consulte la excepción interna para obtener más información. ---> System.IO.FileLoadException: LoadFrom(), LoadFile(), Load(byte[]) y LoadModule() deshabilitó el host.
System.IO.FileLoadException:
en System.Reflection.Assembly.nLoadImage (byte rawAssembly [], byte rawSymbolStore [], evidencia evidencia, StackCrawlMark & stackMark, fIntrospection Boolean)
en System.Reflection.Assembly.Load (Byte [] rawAssembly, Byte [] rawSymbolStore securityEvidence pruebas)
en Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch (CompilerParameters opciones, nombres de archivo String [])
en Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch(CompilerParameters options, String[] sources)
en Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch(CompilerParameters options, String[] sources)
en System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource(CompilerParameters options, String[] s
...
System.InvalidOperationException:
en System.Xml.Serialization.Compiler.Compile (ensamblado principal, String ns, parámetros de CompilerParameters, evidencia evidence)
en System.Xml.Serialization.TempAssembly.GenerateAssembly (xmlMappings de XmlMapping [], Type [] types, String defaultNamespace, evidencia evidence, parámetros de CompilerParameters, ensamblado ensamblado, ensamblados Hashtable)
en System.Xml.Serialization.TempAssemblyconstructor (xmlMappings de XmlMapping [], Type [] types, defaultNamespace String, String ubicación, evidencia evidence)
en System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping, Type type, String defaultNamespace)
en System.Xml.Serialization.XmlSerializerctor(Type Type, String defaultNamespace)
en System.Xml.Serialization.XmlSe...
Por ejemplo, puede recibir el mensaje de error cuando se utiliza un objeto CLR que llama a un servicio Web o realiza conversión de tipos definidos por el usuario a XML dentro de SQL Server.

Causa

Este problema se produce cuando un objeto CLR se convierte al XML de tipo de datos. Cuando se produce esta conversión, Windows Communication Foundation (anteriormente con el nombre en código "Indigo") intenta hacer lo siguiente:
  • Generar un nuevo ensamblado de serialización de XML.
  • Guardar el ensamblado en disco.
  • Cargar el ensamblado en el dominio de aplicación actual.
Sin embargo, SQL Server no permite este tipo de acceso de disco en SQL CLR por motivos de seguridad. Por consiguiente, recibe el mensaje de error que se menciona en la sección "Síntomas". Varios escenarios pueden hacer que el objeto CLR para convertirse en el tipo de datos XML.

Para obtener más información acerca de Windows Communication Foundation, visite el siguiente sitio Web de Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-us/library/ms735119.aspx
Puede recibir el mensaje de error que se menciona en la sección "Síntomas" en los siguientes escenarios:
  • El código CLR que implementa explícitamente objetos CLR utiliza la clase XmlSerializer . Estos objetos CLR pueden incluir procedimientos almacenados, funciones, tipos definidos por el usuario, agregados y desencadenadores.
  • Utilizar un servicio Web en el código de CLR.
  • Enviar o recibir objetos CLR en SQL Server mediante acceso directo de HTTP/SOAP a SQL Server.
  • El objeto CLR convierte a un tipo definido por el usuario en el tipo de datos XML.

Solución

Para resolver este problema, debe utilizar la herramienta Generador de serializador XML (Sgen.exe) para crear el ensamblado de serialización XML para el ensamblado original manualmente. A continuación, cargar los ensamblados en un SQL Server base de datos.

Ejemplo de código

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>
para devolver el resultado correcto, debe crear manualmente el XML ensamblado de serialización para el ensamblado original. Utilice uno de los métodos siguientes para crear manualmente el ensamblado de serialización.

Nota Estos métodos, supongamos que las condiciones siguientes son verdaderas:
  • Ha creado una base de datos dbTest en una instancia de SQL Server 2005.
  • Todos los archivos de proyecto se guardan en el C:\CLRTest carpeta.

Método 1: Crear un proyecto de CLR de SQL Server mediante Microsoft Visual Studio 2005

Puede crear el ensamblado de serialización mediante la opción de Eventos de generación en Microsoft Visual Studio 2005. Para ello, siga estos pasos:
  1. Inicie Visual Studio 2005.
  2. Cree un nuevo proyecto de SQL Server que se denomina MyTest.
  3. En el cuadro de diálogo Agregar referencia de base de datos , haga clic en la referencia que se conecta a la base de datos dbTest y, a continuación, haga clic en Aceptar .

    Si la referencia no está en la lista, debe crear una nueva referencia. Para ello, haga clic en Agregar nueva referencia .
  4. En el menú proyecto , haga clic en Agregar función definida por el usuario . Aparecerá el el cuadro de diálogo Agregar nuevo elemento .
  5. Haga clic en Agregar para agregar un nuevo archivo. De forma predeterminada, el archivo se denomina Function1.cs.

    Nota Recibirá el mensaje de error que se menciona en la sección "Síntomas" sección si implementar el proyecto a la base de datos y, a continuación, ejecuta la siguiente instrucción Transact-SQL:
    SELECT [dbTest].[dbo].[XMLTest] ()
    debe seguir los pasos 6-16 para resolver este problema.
  6. Agregue el código que se enumera en la sección "Ejemplo de código" en el archivo Function1.cs.
  7. En el menú proyecto , haga clic en MyTest propiedades .
  8. En el cuadro de diálogo MyTest , haga clic en la opción de Eventos de generación .
  9. Escriba el comando siguiente en el cuadro Post-build línea de comandos del evento :
    "C:\Archivos de programa\Microsoft Visual Studio 8\SDK\v2.0\Bin\sgen.exe"/force"$ (TargetPath)"
    Nota La opción /Force genera un nuevo ensamblado de serialización cada vez que modifique el ensamblado de origen. Además, debe modificar este comando si tiene instalado Visual Studio 2005 en otra carpeta.
  10. En la carpeta C:\CLRTest, crear dos archivos de texto que se denominan Predeployscript.sql y Postdeployscript.sql.
  11. Agregue las siguientes instrucciones Transact-SQL al archivo Predeployscript.sql:
    IF EXISTS (SELECT [name] FROM sys.assemblies WHERE [name] = N'MyTest.XmlSerializers') 
    	DROP ASSEMBLY [MyTest.XmlSerializers]
    
  12. Agregue las siguientes instrucciones Transact-SQL al archivo Postdeployscript.sql:
    CREATE ASSEMBLY [MyTest.XmlSerializers] from
    'C:\CLRTest\MyTest\MyTest\bin\Debug\MyTest.XmlSerializers.dll'
    WITH permission_set = SAFE
    
  13. En el menú proyecto , haga clic en Agregar elemento existente .
  14. En el cuadro de diálogo Agregar elemento existente , busque la carpeta C:\CLRTest y, a continuación, haga clic en todos los archivos (*. *) en la lista Tipo .
  15. En el cuadro nombre de archivo , escriba Postdeployscript.sql;Predeployscript.sql y, a continuación, haga clic en Aceptar .
  16. En el menú Generar , haga clic en implementar MyTest .
  17. Ejecute la siguiente instrucción de Transact-SQL en SQL Server Management Studio:
    SELECT [dbTest].[dbo].[XMLTest] ()
    recibe el resultado correcto.

Método 2: Crear un proyecto de SQL CLR en la ventana de símbolo del sistema de Visual Studio

  1. Busque la carpeta C:\CLRTest.
  2. Cree un archivo de texto que se denomina MyTest.cs.
  3. Agregue el código que se enumera en la sección "Ejemplo de código" en el archivo MyTest.cs.
  4. Abra la ventana de símbolo del sistema de Visual Studio 2005.
  5. Escriba CD C:\CLRTest y, a continuación, presione ENTRAR.
  6. Escriba csc/t: library MyTest.cs y, a continuación, presione ENTRAR.
  7. Escriba sgen.exe /force MyTest.dll y, a continuación, presione ENTRAR.
  8. Ejecute las siguientes instrucciones Transact-SQL en 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. Ejecute la siguiente instrucción de Transact-SQL en SQL Server Management Studio:
    SELECT [dbTest].[dbo].[XMLTest] ()
    recibe el resultado correcto.

Si utiliza un ensamblado principal que hace referencia a otros ensamblados, debe generar ensamblados de serialización XML para todos los ensamblados que hace referencia el ensamblado principal. A continuación, debe cargar estos ensamblados de serialización XML en la base de datos SQL Server mediante la instrucción CREATE ASSEMBLY.

Estado

Este comportamiento es por diseño.

Referencias

Para obtener más información sobre la serialización XML de CLR objetos de base de datos, visite el siguiente sitio Web de MSDN:
http://msdn2.microsoft.com/en-us/library/ms131088.aspx
Para obtener más información acerca de la herramienta Generador de serializador XML, visite el siguiente sitio Web de MSDN:
http://msdn2.microsoft.com/en-us/library/bk3w6240.aspx

Propiedades

Id. de artículo: 913668 - Última revisión: miércoles, 23 de mayo de 2007 - Versión: 2.1
La información de este artículo se refiere 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
Palabras clave: 
kbmt kbsql2005clr kbexpertiseadvanced kbprb KB913668 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 913668

Enviar comentarios

 

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