Mensagem de erro quando utiliza um objecto de tempo de execução de linguagem comum no SQL Server 2005: "Não é possível carregar a assemblagem da seriação gerada dinamicamente"

Traduções de Artigos Traduções de Artigos
Artigo: 913668 - Ver produtos para os quais este artigo se aplica.
N.º de bugs: 101935 (SQLBUDT)
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Quando utiliza um objecto de tempo de execução (CLR) idioma comuns no Microsoft SQL Server 2005, poderá receber uma mensagem de erro semelhante à seguinte:
Msg 6522, nível de 16, estado 2, linha 1
Ocorreu um erro de .NET Framework durante a execução da rotina definido pelo utilizador ou agregação 'ObjectName':
System.InvalidOperationException: Não é possível carregar a assemblagem da seriação gerada dinamicamente. Em alguns assemblagem de ambientes de alojamento carga funcionalidade é restrita, considere utilizar serializador pre-generated. Consulte a excepção interna para obter mais informações. ---> System.IO.FileLoadException: LoadFrom(), LoadFile(), Load(byte[]) e LoadModule() foram desactivados pelo anfitrião.
System.IO.FileLoadException:
em System.Reflection.Assembly.nLoadImage (byte [] rawAssembly, byte rawSymbolStore [], provas provas, StackCrawlMark & stackMark, fIntrospection boleano)
em System.Reflection.Assembly.Load (byte [] rawAssembly byte [] rawSymbolStore, provas securityEvidence)
em Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch (CompilerParameters opções, nomes de ficheiro String [])
em Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch(CompilerParameters options, String[] sources)
em Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch(CompilerParameters options, String[] sources)
em System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource(CompilerParameters options, String[] s
...
System.InvalidOperationException:
em System.Xml.Serialization.Compiler.Compile (assemblagem principal ns de cadeia, CompilerParameters parâmetros, provas de provas)
em System.Xml.Serialization.TempAssembly.GenerateAssembly (XmlMapping [] xmlMappings, tipo [] tipos, cadeia defaultNamespace, provas de provas, CompilerParameters parâmetros, assemblagem de assemblagens, Hashtable assemblagens)
em System.Xml.Serialization.TempAssemblyConstrutor (XmlMapping [] xmlMappings, tipo [] tipos, cadeia defaultNamespace, cadeia de localização, provas de provas)
em System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping, Type type, String defaultNamespace)
em System.Xml.Serialization.XmlSerializerctor(Type Type, String defaultNamespace)
em System.Xml.Serialization.XmlSe...
Por exemplo, poderá receber a mensagem de erro quando utiliza um objecto CLR que chama um serviço Web ou efectua a conversão de tipos definidos pelo utilizador para XML no interior do SQL Server.

Causa

Este problema ocorre quando um objecto CLR é convertido para o XML tipo de dados. Esta conversão ocorre, o Windows Communication Foundation (com o nome de anteriormente código "Índigo") tenta efectuar o seguinte:
  • Gera uma nova assemblagem da seriação XML.
  • Guarde a assemblagem no disco.
  • Carregar a assemblagem para o domínio de aplicação actual.
No entanto, o SQL Server não permite para este tipo de acesso ao disco de CLR SQL por motivos de segurança. Por conseguinte, recebe a mensagem de erro mencionada na secção "Sintomas". Existem vários cenários poderão provocar o objecto CLR para ser convertido para o tipo de dados XML.

Para obter mais informações sobre o Windows Communication Foundation, visite o seguinte Web site da Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-us/library/ms735119.aspx
Poderá receber a mensagem de erro mencionada na secção "Sintomas" nos seguintes cenários:
  • O código CLR que implementa objectos CLR explicitamente utiliza a classe XmlSerializer . Estes objectos CLR podem incluir procedimentos armazenados, funções, tipos definidos pelo utilizador, agregados e accionadores.
  • Utilizar um serviço Web no código de CLR.
  • Enviar ou receber CLR objectos ou do SQL Server utilizando o acesso HTTP/SOAP directo para o SQL Server.
  • O objecto CLR converte um tipo definido pelo utilizador para o tipo de dados XML.

Resolução

Para resolver este problema, tem de utilizar a ferramenta de gerador de serializador de XML (sgen.exe) para criar a assemblagem da seriação XML para a assemblagem original manualmente. Em seguida, carregar as assemblagens para um servidor de SQL da base de dados.

Exemplo 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 o resultado correcto, tem de criar manualmente o XML assemblagem da seriação para a assemblagem original. Utilize um dos seguintes métodos para criar a assemblagem da seriação manualmente.

Nota Estes métodos pressupõem que verificam as seguintes condições:
  • Criou uma base de dados dbTest numa instância do SQL Server 2005.
  • Todos os ficheiros de projecto são guardados no C:\CLRTest pasta.

Método 1: Criar um projecto de CLR do SQL Server utilizando o Microsoft Visual Studio 2005

É possível criar a assemblagem da seriação utilizando a opção Criar eventos no Microsoft Visual Studio 2005. Para o fazer, siga estes passos:
  1. Inicie o Visual Studio 2005.
  2. Crie um projecto do SQL Server novo denominado MyTest.
  3. Na caixa de diálogo Adicionar referência de base de dados , faça clique sobre a referência que liga à base de dados dbTest e, em seguida, clique em OK .

    Se a referência não consta da lista, tem de criar uma nova referência. Para tal, clique em Adicionar nova referência .
  4. No menu projecto , clique em Adicionar função definidos pelo utilizador . A caixa de diálogo Adicionar novo item é apresentada.
  5. Clique em Adicionar para adicionar um novo ficheiro. Por predefinição, o ficheiro é o nome Function1.cs.

    Nota Recebe a mensagem de erro mencionada na "Sintomas" secção se implementar o projecto na base de dados e, em seguida, execute a seguinte instrução Transact-SQL:
    SELECT [dbTest].[dbo].[XMLTest] ()
    tem de seguir os passos 6-16, para resolver este problema.
  6. Adicione o código é listado na secção "Exemplo de código" para o ficheiro Function1.cs.
  7. No menu projecto , clique em MyTest propriedades .
  8. Na caixa de diálogo MyTest , clique na opção de Criar eventos .
  9. Escreva o seguinte comando na caixa Post-build comandos do evento :
    "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sgen.exe"force"$ (TargetPath)"
    Nota A opção/Forçar gera uma nova assemblagem da seriação sempre que modificar a assemblagem de origem. Além disso, tem de modificar este comando se instalou o Visual Studio 2005 noutra pasta.
  10. Na pasta C:\CLRTest, crie dois ficheiros de texto são denominados Predeployscript.sql e Postdeployscript.sql.
  11. Adicione as seguintes instruções de Transact-SQL ao ficheiro Predeployscript.sql:
    IF EXISTS (SELECT [name] FROM sys.assemblies WHERE [name] = N'MyTest.XmlSerializers') 
    	DROP ASSEMBLY [MyTest.XmlSerializers]
    
  12. Adicione as seguintes instruções de Transact-SQL ao ficheiro Postdeployscript.sql:
    CREATE ASSEMBLY [MyTest.XmlSerializers] from
    'C:\CLRTest\MyTest\MyTest\bin\Debug\MyTest.XmlSerializers.dll'
    WITH permission_set = SAFE
    
  13. No menu projecto , clique em Adicionar Item existente .
  14. Na caixa de diálogo Adicionar produto existente , localize a pasta C:\CLRTest e, em seguida, clique em todos os ficheiros (*. *) na lista ficheiros do tipo .
  15. Na caixa nome do ficheiro , escreva Postdeployscript.sql;Predeployscript.sql e, em seguida, clique em OK .
  16. No menu criar , clique em Implementar MyTest .
  17. Execute a seguinte instrução Transact-SQL no SQL Server Management Studio:
    SELECT [dbTest].[dbo].[XMLTest] ()
    receberá o resultado correcto.

Método 2: Criar um projecto de CLR SQL na janela linha de comandos de Visual Studio

  1. Localize a pasta C:\CLRTest.
  2. Crie um ficheiro de texto denominado MyTest.cs.
  3. Adicione o código é listado na secção "Exemplo de código" para o ficheiro MyTest.cs.
  4. Abra a janela de linha de comandos do Visual Studio 2005.
  5. Escreva CD C:\CLRTest e, em seguida, prima ENTER.
  6. Escreva csc /t:library MyTest.cs e, em seguida, prima ENTER.
  7. Escreva sgen.exe /force MyTest.dll e, em seguida, prima ENTER.
  8. Execute as seguintes instruções de Transact-SQL no 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. Execute a seguinte instrução Transact-SQL no SQL Server Management Studio:
    SELECT [dbTest].[dbo].[XMLTest] ()
    receberá o resultado correcto.

Se utilizar uma assemblagem principal que referencia outras assemblagens, tem de gerar assemblagens de serialização de XML para todas as assemblagens referidas pela assemblagem principal. Em seguida, tem de carregar estas assemblagens de serialização de XML na base de dados do SQL Server utilizando a instrução CREATE ASSEMBLY.

Ponto Da Situação

Este comportamento ocorre por predefinição.

Referências

Para mais informações sobre a serialização de XML de CLR objectos de base de dados, visite o seguinte Web site da MSDN:
http://msdn2.microsoft.com/en-us/library/ms131088.aspx
Para obter mais informações sobre a ferramenta de gerador de serializador de XML, visite o seguinte site da Web MSDN:
http://msdn2.microsoft.com/en-us/library/bk3w6240.aspx

Propriedades

Artigo: 913668 - Última revisão: 23 de maio de 2007 - Revisão: 2.1
A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL 2005 Server Enterprise
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL 2005 Server Workgroup
Palavras-chave: 
kbmt kbsql2005clr kbexpertiseadvanced kbprb KB913668 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 913668

Submeter comentários

 

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