Foutbericht wanneer u een common language runtime-object in SQL Server 2005 gebruiken: 'Kan dynamisch gegenereerde assembly voor serialisatie niet laden'


BUG #: 101935 (SQLBUDT)

Symptomen


Wanneer u een common language runtime (CLR)-object in Microsoft SQL Server 2005, wordt een foutbericht weergegeven dat lijkt op het volgende:
Msg 6522, niveau-16 staat 2, regel 1
Een .NET Framework-fout is opgetreden tijdens de uitvoering van door de gebruiker gedefinieerde routine of statistische objectnaam:
System.InvalidOperationException: Kan dynamisch gegenereerde assembly voor serialisatie niet laden. In sommige hosting omgevingen assembly geladen functionaliteit is beperkt, kunt u met behulp van vooraf gegenereerde serialisator. Zie interne uitzondering voor meer informatie. ---> System.IO.FileLoadException: LoadFrom (), LoadFile(), Load(byte[]) en LoadModule() zijn uitgeschakeld door de host.
System.IO.FileLoadException:

op System.Reflection.Assembly.nLoadImage (Byte [] rawAssembly, Byte [] rawSymbolStore, bewijs van bewijsmateriaal, StackCrawlMark & stackMark, Boolean fIntrospection)
op System.Reflection.Assembly.Load (Byte [] rawAssembly Byte [] rawSymbolStore, securityEvidence bewijsmateriaal)
bij Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch (CompilerParameters-opties, bestandsnamen voor String [])
bij Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch (CompilerParameters-opties, bronnen voor String [])
bij Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch (CompilerParameters-opties, bronnen voor String [])
bij System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource (CompilerParameters-opties, String [] s
...
System.InvalidOperationException:
op System.Xml.Serialization.Compiler.Compile (bovenliggende Assembly, String ns, CompilerParameters parameters, bewijzen bewijzen)
op System.Xml.Serialization.TempAssembly.GenerateAssembly (XmlMapping [] xmlMappings, Type [] typen, String defaultNamespace, bewijzen bewijzen, CompilerParameters parameters, Assembly assembly, samenstellen van hash-tabel)
op System.Xml.Serialization.TempAssembly... ctor (XmlMapping [] xmlMappings, Type [] typen, String defaultNamespace, String locatie, bewijzen bewijzen)
op System.Xml.Serialization.XmlSerializer.GenerateTempAssembly (XmlMapping xmlMapping, Type type, String defaultNamespace)
op System.Xml.Serialization.XmlSerializer... ctor (Type type, String defaultNamespace)
op System.Xml.Serialization.XmlSe...
Wordt mogelijk het foutbericht weergegeven wanneer u een CLR-object dat een webservice wordt aangeroepen of conversie van door de gebruiker gedefinieerde typen naar XML in SQL Server wordt uitgevoerd.

Oorzaak


Dit probleem treedt op wanneer een CLR-object wordt geconverteerd naar het XML-gegevenstype. Bij deze conversie probeert Windows Communication Foundation (voorheen aangeduid met de codenaam "Indigo") het volgende doen:
  • Genereer een nieuwe XML-serialisatie assemblage.
  • De assembly op schijf opslaan.
  • De assembly in het huidige domein laden.
SQL Server is echter niet toegestaan voor dit type toegang tot de schijf in de SQL CLR om veiligheidsredenen. Daarom wordt het foutbericht weergegeven dat wordt vermeld in de sectie 'Symptomen'. Verschillende scenario's mogelijk de CLR-object wordt geconverteerd naar het XML-gegevenstype.

Ga naar de volgende website van Microsoft Developer Network (MSDN) voor meer informatie over de Windows Communication Foundation:Verschijnt het foutbericht dat wordt vermeld in de sectie 'Symptomen' in de volgende scenario's:
  • De CLR-code waarmee CLR-objecten expliciet gebruikt de klasse XmlSerializer . Deze CLR-objecten kunnen bevatten, opgeslagen procedures, functies, door de gebruiker gedefinieerde typen, triggers en samenvoegingen.
  • U kunt een webservice gebruiken in de code CLR.
  • Verzenden of ontvangen van CLR-objecten naar of van SQL Server met behulp van directe HTTP/SOAP-toegang tot SQL Server.
  • Een door de gebruiker gedefinieerde type converteert CLR-object naar het XML-gegevenstype.

Oplossing


Dit probleem op te lossen moet u het XML-Serializer Generator-hulpprogramma (Sgen.exe) voor het maken van de XML-serialisatie assembly voor de montage van de oorspronkelijke handmatig. Laadt de assembly's in een SQL Server-database.

Voorbeeld van code

U kunt bijvoorbeeld een CLR-functie XML-gegevens met behulp van een assembly die is gemaakt door in het volgende voorbeeld geeft als resultaat:
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();
}

}
}
Als u de functie XMLTest in SQL Server Management Studio, verwacht u het volgende resultaat:
<?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>
Om het juiste resultaat retourneert, moet u de XML-serialisatie assembly voor de montage van de oorspronkelijke handmatig maken. Een van de volgende methoden gebruiken om de assembly voor serialisatie handmatig maken.

Opmerking Deze methoden wordt ervan uitgegaan dat de volgende voorwaarden voldaan wordt:
  • U kunt een besturingssysteem voor meer informatie -database hebt gemaakt in een exemplaar van SQL Server 2005.
  • De projectbestanden worden opgeslagen in de map C:\CLRTest.

Methode 1: Een SQL-Server CLR-project maken met behulp van Microsoft Visual Studio 2005

Met behulp van de optie Gebeurtenissen maken in Microsoft Visual Studio 2005 kunt u de assembly voor serialisatie. Ga hiervoor als volgt te werk:
  1. Start Visual Studio 2005.
  2. Maak een nieuwe SQL Server-project met de naam MyTest.
  3. Klik op de verwijzing die is verbonden met de database van het besturingssysteem voor meer informatie in het dialoogvenster Databaseverwijzing toevoegen en klik op OK.

    Als de verwijzing niet in de lijst, moet u een nieuwe verwijzing. Hiertoe klikt u op Nieuwe verwijzing toevoegen.
  4. Klik in het menu Project op Add User-Defined-functie. Het dialoogvenster Add New Item wordt weergegeven.
  5. Klik op toevoegen om een nieuw bestand toevoegen. Standaard is het bestand de naam Function1.cs.

    Opmerking U ontvangt het foutbericht dat wordt vermeld in de sectie 'Symptomen' als u het project te met de database implementeren en voer vervolgens de volgende Transact-SQL-instructie:
    SELECT [dbTest].[dbo].[XMLTest] ()
    U moet stappen 6-16 om dit probleem te verhelpen.
  6. Voeg de code die wordt vermeld in de sectie 'Voorbeeld' naar het bestand Function1.cs.
  7. Klik in het menu Project op MyTest eigenschappen.
  8. Klik in het dialoogvenster MyTest op de
    De optie Gebeurtenissen maken .
  9. Typ de volgende opdracht in het vak opdrachtregel voor gebeurtenis na te bouwen :
    "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sgen.exe" / Force "$(TargetPath)"
    Opmerking De optie/force genereert een nieuwe assembly voor serialisatie elke keer dat u de bron-vergadering wijzigen. Als u Visual Studio 2005 in een andere map hebt geïnstalleerd, moet u ook deze opdracht wijzigen.
  10. Maak twee tekstbestanden met de Predeployscript.sql en Postdeployscript.sql in de map C:\CLRTest.
  11. De volgende Transact-SQL-instructies toevoegen aan het bestand Predeployscript.sql:
    IF EXISTS (SELECT [name] FROM sys.assemblies WHERE [name] = N'MyTest.XmlSerializers') 
    DROP ASSEMBLY [MyTest.XmlSerializers]
  12. De volgende Transact-SQL-instructies toevoegen aan het bestand Postdeployscript.sql:
    CREATE ASSEMBLY [MyTest.XmlSerializers] from
    'C:\CLRTest\MyTest\MyTest\bin\Debug\MyTest.XmlSerializers.dll'
    WITH permission_set = SAFE
  13. Klik op Add Existing Itemin het menu Project .
  14. Ga naar de map C:\CLRTest in het dialoogvenster Add Existing Item en klik vervolgens op alle bestanden (*. *)in de lijst bestandstype .
  15. Typ in het vak bestandsnaam
    Postdeployscript.sql; Predeployscript.SQL, en klik vervolgens op
    OK.
  16. Klik op het menu Build MyTest implementeren.
  17. Voer de volgende Transact-SQL-instructie in SQL Server Management Studio:
    SELECT [dbTest].[dbo].[XMLTest] ()
    U ontvangt het juiste resultaat.

Methode 2: Build een SQL CLR-project in het venster opdrachtprompt van Visual Studio

  1. Zoek de map C:\CLRTest.
  2. Maak een tekstbestand met de naam MyTest.cs.
  3. Voeg de code die wordt vermeld in de sectie 'Voorbeeld' naar het bestand MyTest.cs.
  4. Open het venster Visual Studio 2005 Command Prompt.
  5. Typ CD C:\CLRTesten druk op ENTER.
  6. Typ csc, /t:library MyTest.csen druk op ENTER.
  7. Typ sgen.exe/force MyTest.dllen druk op ENTER.
  8. De volgende Transact-SQL-instructies uitvoeren 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. Voer de volgende Transact-SQL-instructie in SQL Server Management Studio:
    SELECT [dbTest].[dbo].[XMLTest] ()
    U ontvangt het juiste resultaat.

Als u een hoofd-assembly die verwijst naar andere assembly's gebruikt, moet u de assembly's voor XML-serialisatie voor de assembly's waarnaar wordt verwezen door de belangrijkste assembly genereren. Vervolgens moet u deze XML-serialisatie assembly's in de SQL Server-database laden met behulp van de instructie CREATE ASSEMBLY.

Status


Dit gedrag is inherent aan het ontwerp.

Referenties


Ga naar de volgende MSDN-website voor meer informatie over XML-serialisatie van databaseobjecten CLR:Ga naar de volgende MSDN-website voor meer informatie over het XML-Serializer Generator-hulpprogramma: