Wenn eine CLR-Routine ausführen oder Assembly in SQL Server verwenden: "Assembly im Hostspeicher hat eine unterschiedliche Signatur der Assembly im GAC. (Ausnahme von HRESULT: 0x80131050) "

Gilt für: SQL Server 2012 EnterpriseSQL Server 2012 StandardSQL Server 2012 Developer

Problembeschreibung


Betrachten Sie die folgenden Szenarien.

Szenario 1

Sie erstellen eine allgemeine Language Runtime (CLR)-Routine, die Microsoft.NET Framework-Assembly verweist. Die.NET Framework-Assembly ist nicht im Knowledge Base-Artikel 922672 dokumentiert. Anschließend installieren Sie.NET Framework 3.5 oder.NET Framework 2.0-basierte Hotfix.

Szenario 2

Sie erstellen eine Assembly und Registrieren der Assembly in einer Microsoft SQL Server-Datenbank. Anschließend installieren Sie eine andere Version der Assembly im globalen Assemblycache (GAC).

Wenn Sie CLR-Routine ausführen oder die Assembly aus einem der folgenden Szenarien in SQL Server, erhalten Sie eine Fehlermeldung, die der folgenden ähnelt:

Server: Msg 6522, Ebene 16, Status 2, Zeile 1
.NET Framework-Fehler beim Ausführen der benutzerdefinierten Routine oder aggregate "Getsid":

System.IO.FileLoadException: Konnte nicht geladen werden, Datei oder Assembly ' System.DirectoryServices, Version = 2.0.0.0, Culture = Neutral, PublicKeyToken = b03f5f7f11d50a3a' oder eine Abhänigkeit. Assembly im Hostspeicher hat eine unterschiedliche Signatur der Assembly im GAC. (Ausnahme von HRESULT: 0x80131050)

System.IO.FileLoadException:

Ursache


Beim Laden einer Assembly durch der CLR überprüft die CLR, dass dieselbe Assembly im GAC befindet. Wenn dieselbe Assembly im GAC ist, CLR überprüft, ob das Modul Versions-IDs (MVIDs) dieser Assemblys übereinstimmen. Wenn die MVIDs diese Assemblys nicht übereinstimmen, erhalten Sie die Fehlermeldung, die im Abschnitt "Symptome" erwähnt.

Bei eine Assembly kompiliert ist, ändert die MVID der Assembly. Aktualisieren von.NET Framework eventuell die.NET Framework-Assemblys verschiedene MVIDs, da diese Assemblys kompiliert werden. Wenn Sie Ihrer Assembly aktualisieren, außerdem die Assembly kompiliert. Daher verfügt die Assembly einer anderen MVID.

PROBLEMUMGEHUNG


Abhilfemaßnahme 1

Um zu Szenario 1 im Abschnitt "Symptome" zu umgehen, müssen Sie die.NET Framework-Assemblys in SQL Server manuell aktualisieren. Dazu verwenden Sie die ALTER ASSEMBLY -Anweisung auf die neue Version der.NET Framework-Assembly im folgenden Ordner:
%Windir%\Microsoft.NET\Framework\Version
Hinweis Version ist die Version von.NET Framework, die installiert oder aktualisiert.

Abhilfemaßnahme 2

Um zu Szenario 2 im Abschnitt "Symptome" zu umgehen, verwenden Sie ALTER ASSEMBLY -Anweisung die Assembly in der Datenbank aktualisieren.

Wenn das Problem weiterhin besteht, nachdem Sie dies getan haben, die Assembly aus der Datenbank gelöscht, und registrieren Sie die neue Version der Assembly in der Datenbank.

Status


Microsoft hat bestätigt, dass es sich um ein Problem bei den Microsoft-Produkten handelt, die im Abschnitt „Eigenschaften“ aufgeführt sind.

Weitere Informationen


Wir empfehlen nicht, nicht im Knowledge Base-Artikel 922672 beschriebenen,.NET Framework-Assemblys zu verwenden. Knowledge Base-Artikel 922672 Listet die Assemblys auf, die in der SQL Server-CLR-gehosteten Umgebung getestet.

Klicken Sie für weitere Informationen auf die folgende Artikelnummer, um den Artikel in der Microsoft Knowledge Base anzuzeigen:
922672 support-Richtlinie für ungetestete.NET Framework-Assemblys in der SQL Server-CLR-gehosteten Umgebung

Beschreibung des CLR-Routinen

CLR-Routinen gehören die folgenden Objekte, die mit SQL Server Integration der.NET Framework CLR implementiert werden:
  • Benutzerdefinierte Skalarwertfunktionen (skalare UDFs)
  • Benutzerdefinierte Tabellenwertfunktionen (TVFs)
  • Benutzerdefinierte Prozeduren (benutzerdefinierten Eigenschaften)
  • Benutzerdefinierte Trigger
  • Benutzerdefinierte Datentypen
  • Benutzerdefinierte Aggregate

Assemblys nach Installation von.NET Framework 3.5 aktualisiert

Nach der Installation von.NET Framework 3.5 müssen Sie mithilfe von ALTER ASSEMBLY -Anweisung die folgenden Assemblys aktualisieren:
  • Accessibility.dll
  • AspNetMMCExt.dll
  • Cscompmgd.dll
  • IEExecRemote.dll
  • IEHost.dll
  • IIEHost.dll
  • Microsoft.Build.Conversion.dll
  • Microsoft.Build.Engine.dll
  • Microsoft.Build.Framework.dll
  • Microsoft.Build.Tasks.dll
  • Microsoft.Build.Utilities.dll
  • Microsoft.CompactFramework.Build.Tasks.dll
  • Microsoft.JScript.dll
  • Microsoft.VisualBasic.Vsa.dll
  • Microsoft.Vsa.dll
  • Microsoft.Vsa.Vb.CodeDOMProcessor.dll
  • Microsoft_VsaVb.dll
  • Sysglobl.dll
  • System.Configuration.Install.dll
  • System.Design.dll
  • System.DirectoryServices.dll
  • System.DirectoryServices.Protocols.dll
  • System.Drawing.dll
  • System.Drawing.Design.dll
  • System.EnterpriseServices.dll
  • System.Management.dll
  • System.Messaging.dll
  • System.Runtime.Serialization.Formatters.Soap.dll
  • System.ServiceProcess.dll
  • System.Web.dll
  • System.Web.Mobile.dll
  • System.Web.RegularExpressions.dll
Diese Assemblys sind in folgendem Ordner:
%Windir%\Microsoft.NET\Framework\v2.0.50727

Wie die Daten von benutzerdefinierten Datentypen nach eine Assembly löschen beibehalten

Wenn Sie eine Baugruppe ablegen, die ein benutzerdefinierten Datentyp von SQL Server verwendet können eine der folgenden Methoden Sie die Daten beibehalten.

Angenommen Sie, das folgende Szenario:
  • Sie erstellen eine Assembly mit dem Namen
    MyAssembly.dll.
  • Assemblyverweise MyAssembly der
    System.DirectoryServices.dll Assembly.
  • Sie haben einen benutzerdefinierten Datentyp, dessen Name
    MyDateTime.
  • MyDateTime -Datentyp verwendet die Assembly MyAssembly.dll.
  • Sie erstellen eine Tabelle, deren Name MyTable.
  • Der MyTable-Tabelle enthält die Daten vom Typ MyDateTime .

Methode 1: Verwenden Sie das Dienstprogramm bcp.exe

  1. Verwenden Sie das Dienstprogramm Bcp.exe mit – n Switch die Daten aus der Tabelle MyTable in eine Datei zu kopieren. Beispielsweise führen Sie den folgenden Befehl ein:
    bcp MyDatabase.dbo.MyTable out C:\MyFile.bcp -n –SSQLServerName  -T
  2. Folgendermaßen gehen Sie in SQL Server Management Studio vor:
    1. Löschen Sie die MyTable-Tabelle.
    2. Legen Sie den Datentyp MyDateTime .
    3. Drop Assembly System.DirectoryServices.dll .
    4. Löschen Sie die Assembly MyAssembly .
  3. Folgendermaßen gehen Sie in SQL Server Management Studio vor:
    1. Registrieren Sie die Assembly System.DirectoryServices.dll .
    2. Registrieren Sie die Assembly MyAssembly .
    3. Erstellen Sie MyDateTime -Datentyp.
    4. Erstellen Sie eine neue Tabelle mit derselben Tabellenstruktur wie die Tabelle MyTable.
  4. Verwenden Sie das Dienstprogramm Bcp.exe zusammen mit dem n- Daten in die Tabelle MyTable aus der Datei importiert. Beispielsweise führen Sie den folgenden Befehl ein:
    bcp MyDatabase.dbo.MyTable in C:\MyFile.bcp -n –SSQLServerName  -T

Methode 2: Verwenden der INSERT... SELECT-Anweisung

Nehmen wir an, der Datentyp MyDateTime belegt 9 Bytes im Speicher.
  1. Erstellen Sie in SQL Server Management Studio eine neue Tabelle mit einer Spalte vom Typ VARBINARY(9) durch die folgende Anweisung ausführen:
    CREATE TABLE TempTable (c1 VARBINARY(9))
  2. Die folgenden Einfügen... Wählen Sie Anweisung TempTable Tabelle aufzufüllen:
    INSERT INTO TempTable SELECT CAST(c1 as VARBINARY(9)) FROM MyTable
  3. Folgendermaßen gehen Sie in SQL Server Management Studio vor:
    1. Löschen Sie die MyTable-Tabelle.
    2. Legen Sie den Datentyp MyDateTime .
    3. Drop Assembly System.DirectoryServices.dll .
    4. Löschen Sie die Assembly MyAssembly .
  4. Folgendermaßen gehen Sie in SQL Server Management Studio vor:
    1. Registrieren Sie die Assembly System.DirectoryServices.dll .
    2. Registrieren Sie die Assembly MyAssembly .
    3. Erstellen Sie MyDateTime -Datentyp.
    4. Erstellen Sie eine neue Tabelle mit derselben Tabellenstruktur wie die Tabelle MyTable.
  5. Die folgenden Einfügen... Wählen Sie -Anweisung die Tabelle MyTable auffüllen:
    INSERT INTO MyTable SELECT c1 FROM TempTable

Referenzen


Weitere Informationen über die Version der Assembly finden Sie auf der folgenden Microsoft Developer Network (MSDN)-Website:
Weitere Informationen zum Aktualisieren einer Assembly finden Sie auf der folgenden MSDN-Website:
Weitere Informationen zum Löschen einer Assembly finden Sie auf der folgenden MSDN-Website:
Weitere Informationen zum Registrieren eine Assembly in SQL Server 2005-Datenbank finden Sie auf der folgenden MSDN-Website:
Weitere Informationen zum Dienstprogramm Bcp.exe finden Sie auf der folgenden MSDN-Website: