Fehlermeldung, wenn Sie ein Objekt der common Language Runtime in SQL Server 2005 verwenden: "Dynamisch generierte Serialisierungsassembly kann nicht geladen werden"


Fehler #: 101935 (SQLBUDT)

Problembeschreibung


Wenn Sie ein Objekt der common Language Runtime (CLR) in Microsoft SQL Server 2005 verwenden, wird möglicherweise eine Fehlermeldung ähnlich der folgenden:
Msg 6522, Ebene 16, Status 1 Zeile 2
.NET Framework-Fehler beim Ausführen der benutzerdefinierten Routine oder aggregate 'Objektname':
System.InvalidOperationException: Dynamisch generierte Serialisierungsassembly kann nicht geladen werden. In einer Hosting-Umgebung Assembly laden Funktionalität eingeschränkt ist, vorgenerierte Serialisierungsprogramm verwenden. Innere Ausnahme Weitere Informationen anzeigen ---> System.IO.FileLoadException: LoadFrom, LoadFile(), Load(byte[]) und LoadModule() wurden vom Host deaktiviert.
System.IO.FileLoadException:

Bei System.Reflection.Assembly.nLoadImage (Byte [] RawAssembly, Byte [] RawSymbolStore Nachweis Beweise, StackCrawlMark und StackMark, boolesche fIntrospection)
am System.Reflection.Assembly.Load (Byte [] RawAssembly, Byte [] RawSymbolStore Beweise SecurityEvidence)
bei Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch (CompilerParameters Optionen, String []-Dateinamen)
bei Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch (CompilerParameters Optionen, String [] Quellen)
bei Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch (CompilerParameters Optionen, String [] Quellen)
Bei System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource (CompilerParameters Optionen, String [] s
...
System.InvalidOperationException:
Bei System.Xml.Serialization.Compiler.Compile (übergeordnete Assemblierung Zeichenfolge ns CompilerParameters Parameter, Beweise Beweise)
Bei System.Xml.Serialization.TempAssembly.GenerateAssembly (XmlMapping [] XmlMappings Type [] Types Zeichenfolge DefaultNamespace, Beweise Beweise, CompilerParameters Parameter, Montage, Hashtable Assemblys)
am System.Xml.Serialization.TempAssembly... Ctor (XmlMapping [] XmlMappings Type [] Types DefaultNamespace Zeichenfolge, Zeichenfolge Speicherort, Beweise Beweise)
Bei System.Xml.Serialization.XmlSerializer.GenerateTempAssembly (XmlMapping XmlMapping, Typ String DefaultNamespace)
Bei System.Xml.Serialization.XmlSerializer... Ctor (Typ, Zeichenfolge DefaultNamespace)
am System.Xml.Serialization.XmlSe...
Beispielsweise erhalten Sie die Fehlermeldung, wenn Sie ein CLR-Objekt verwenden, die einen Webdienst aufruft oder Konvertierung von benutzerdefinierten Typen in XML in SQL Server.

Ursache


Dieses Problem tritt auf, wenn ein CLR-Objekt in der XML-Datentyp konvertiert wird. Bei dieser Konvertierung versucht Windows Communication Foundation (früherer Codename "Indigo") Folgendes:
  • Generieren Sie eine neue XML-Serialisierungsassembly.
  • Speichern der Assembly.
  • Laden Sie die Assembly in die aktuelle Anwendungsdomäne.
SQL Server lässt jedoch nicht für diese Art von Zugriff auf die Festplatte in der SQL CLR aus Sicherheitsgründen. Daher erhalten Sie die Fehlermeldung, die im Abschnitt "Symptome" genannt wird. Mehrere Szenarien möglicherweise das CLR-Objekt in der XML-Datentyp konvertiert werden.

Weitere Informationen zu Windows Communication Foundation finden Sie auf der folgenden Website von Microsoft Developer Network (MSDN):Sie erhalten die Fehlermeldung, die im Abschnitt "Symptome" in den folgenden Szenarios erwähnt:
  • CLR-Code, der CLR-Objekte explizit implementiert mithilfe der XmlSerializer -Klasse. Die CLR-Objekte können gespeicherte Prozeduren, Funktionen, benutzerdefinierte Typen, Aggregate und Trigger enthalten.
  • Einen Webdienst verwenden in CLR-Code.
  • Senden oder Empfangen von CLR-Objekten zu oder von SQL Server mithilfe von HTTP/SOAP Direktzugriff auf SQL Server.
  • Das CLR-Objekt konvertiert einen benutzerdefinierten Typ in den XML-Datentyp.

Problemlösung


Zum Beheben dieses Problems müssen Sie XML Serializer Generator Tool (Sgen.exe) verwenden, erstellen Sie die XML-Serialisierungsassembly für die ursprüngliche Assembly manuell. Dann werden geladen Sie die Assemblys in einer SQL Server-Datenbank.

Codebeispiel

Sie möchten beispielsweise eine CLR-Funktion erstellen, die XML-Daten mit dem folgenden Codebeispiel erstellt zurückgibt:
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();
}

}
}
Beim Aufrufen der XMLTest -Funktion in SQL Server Management Studio erwarten Sie folgende Ergebnis:
<?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>
Um das richtige Ergebnis zurückzugeben, müssen Sie die XML-Serialisierungsassembly für die ursprüngliche Assembly manuell erstellen. Verwenden Sie eine der folgenden Methoden die Serialisierungsassembly manuell erstellen.

Hinweis Diese Methoden wird davon ausgegangen, dass Folgendes zutrifft:
  • Sie haben eine DbTest Datenbank in einer Instanz von SQL Server 2005.
  • Alle Projektdateien werden im Ordner C:\CLRTest gespeichert.

Methode 1: Erstellen eines SQL Server-CLR-Projekts mit Microsoft Visual Studio 2005

Sie können die Serialisierungsassembly mithilfe der Option Buildereignisse in Microsoft Visual Studio 2005 erstellen. Gehen Sie hierzu folgendermaßen vor:
  1. Starten Sie Visual Studio 2005.
  2. Erstellen Sie ein neues SQL Server-Projekt mit dem Namen MyTest.
  3. Klicken Sie im Dialogfeld Datenbankverweis hinzufügen auf den Verweis, der mit der Datenbank DbTest verbindet, und klicken Sie auf OK.

    Wenn der Verweis nicht in der Liste enthalten ist, müssen Sie einen neuen Verweis erstellen. Klicken Sie hierzu auf Neuen Verweis hinzufügen.
  4. Klicken Sie im Menü Projekt auf Benutzerdefinierten Funktion. Das Dialogfeld Neues Element hinzufügen wird angezeigt.
  5. Klicken Sie auf Hinzufügen , um eine neue Datei hinzufügen. Standardmäßig heißt die Datei Function1.cs.

    Hinweis Sie erhalten die Fehlermeldung, die im Abschnitt "Symptome" erwähnte, wenn Sie das Projekt in der Datenbank bereitstellen und führen die folgende Transact-SQL-Anweisung:
    SELECT [dbTest].[dbo].[XMLTest] ()
    Befolgen Sie die Schritte 6 bis 16, um dieses Problem zu beheben.
  6. Fügen Sie den Code, der im Abschnitt "Code Example" in der Datei Function1.cs aufgeführt.
  7. Klicken Sie im Menü Projekt auf MyTest-Eigenschaften.
  8. Klicken Sie im Dialogfeld MyTest auf der
    Buildereignisse Option.
  9. Geben Sie folgenden Befehl in das Feld Befehlszeile für Postbuildereignis :
    "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sgen.exe" / Force "$(targetpath)""
    Hinweis Die Option/force generiert eine neue Serialisierungsassembly jedem Quelle ändern. Außerdem müssen Sie diesen Befehl ändern, wenn Sie Visual Studio 2005 in einem anderen Ordner installiert.
  10. Erstellen Sie im Ordner C:\CLRTest zwei Textdateien mit den Namen Predeployscript.sql und "PostDeployScript.SQL".
  11. Fügen Sie die folgende Transact-SQL-Anweisung in die Datei Predeployscript.sql:
    IF EXISTS (SELECT [name] FROM sys.assemblies WHERE [name] = N'MyTest.XmlSerializers') 
    DROP ASSEMBLY [MyTest.XmlSerializers]
  12. Fügen Sie die folgende Transact-SQL-Anweisung in die Datei "PostDeployScript.SQL":
    CREATE ASSEMBLY [MyTest.XmlSerializers] from
    'C:\CLRTest\MyTest\MyTest\bin\Debug\MyTest.XmlSerializers.dll'
    WITH permission_set = SAFE
  13. Klicken Sie im Menü Projekt auf Vorhandenes Element hinzufügen.
  14. Klicken Sie im Dialogfeld Vorhandenes Element hinzufügen C:\CLRTest Ordner und klicken Sie dann auf Alle Dateien (*. *)in der Liste .
  15. Geben Sie im Feld Dateiname
    "PostDeployScript.SQL" ; Predeployscript.SQL, und klicken Sie dann auf
    OK.
  16. Klicken Sie im Menü Erstellen auf MyTest bereitstellen.
  17. Führen Sie die folgende Transact-SQL-Anweisung in SQL Server Management Studio:
    SELECT [dbTest].[dbo].[XMLTest] ()
    Sie erhalten das korrekte Ergebnis.

Methode 2: Erstellen Sie ein SQL CLR-Projekt in der Visual Studio-Eingabeaufforderungsfenster

  1. Suchen Sie den Ordner C:\CLRTest.
  2. Erstellen Sie eine Textdatei mit dem Namen MyTest.cs.
  3. Fügen Sie den Code, der im Abschnitt "Code Example" in der Datei MyTest.cs aufgeführt.
  4. Öffnen Sie das Visual Studio 2005-Eingabeaufforderungsfenster.
  5. Geben Sie CD C:\CLRTestund drücken Sie dann die EINGABETASTE.
  6. Geben Sie csc /t:library MyTest.cs, und drücken Sie dann die EINGABETASTE.
  7. Geben Sie sgen.exe/Force MyTest.dll, und drücken Sie dann die EINGABETASTE.
  8. Führen Sie die folgende Transact-SQL-Anweisung 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. Führen Sie die folgende Transact-SQL-Anweisung in SQL Server Management Studio:
    SELECT [dbTest].[dbo].[XMLTest] ()
    Sie erhalten das korrekte Ergebnis.

Verwenden Sie eine Hauptassembly, die auf andere Assemblys verweist, müssen Sie XML-Serialisierungsassemblys für alle Assemblys generieren, die von der Hauptassembly verwiesen wird. Dann müssen Sie diese XML-Serialisierungsassemblys in der SQL Server-Datenbank mit der CREATE ASSEMBLY-Anweisung laden.

Status


Dieses Verhalten ist entwurfsbedingt.

Referenzen


Weitere Informationen zur XML-Serialisierung von CLR-Datenbankobjekten finden Sie auf der folgenden MSDN-Website:Weitere Informationen über das XML Serializer Generator-Tool finden Sie auf der folgenden MSDN-Website: