it-swarm.com.de

SqlServerSpatial.dll kann nicht geladen werden

Ich versuche, die SqlServer Spatial-CLR-Typen in einem C # .NET-Projekt zu verwenden. Ich möchte SqlGeometry verwenden, um räumliche Datensätze aus meiner Datenbank abzufragen.

Ich habe dies auf einem lokalen Computer in einem Komponententest, der in Visual Studio 2010 ausgeführt wird, auf einen Remote-SqlServer-Computer ausgeführt. Alles gut.

Ich veröffentliche dann einen WCF-Rest-Dienst in meiner lokalen IIS -Instanz, die über einen Dienst verfügt, der dieselbe Klassenbibliothek als der Unit-Test abruft, um räumliche Abfragen durchzuführen, und er schlägt fehl.

Ich bekomme eine Fehlermeldung 

DLL SqlServerSpatial.dll kann nicht geladen werden: Das angegebene Modul könnte nicht gefunden werden.

Ich habe das gegoogelt und viele, viele Antworten gefunden - keine Arbeit für mich ... Ich habe:

  • hat die CLR-Typen beim GAC registriert
  • installieren Sie die 64-Bit-Version und später auch die 32-Bit-Version von VC++
  • versuchte viele Variationen der Verwendung verschiedener Versionen von Microsoft.SqlServer.Types dll

Das einzige, was ich nicht getan habe und ehrlich gesagt ablehnen möchte, ist, etwas auf der eigentlichen SqlServer-Box zu installieren. Das erscheint mir unnötig. 

An dieser Stelle kann ich nur daran denken, dass dies ein Berechtigungsproblem ist, da es in einem IIS - App-Pool ausgeführt wird und nicht in Studio, wo es im Komponententest funktioniert.

Beachten Sie, dass ich in meinem Projekt NIE auf die in der Fehlermeldung angegebene DLL verweise. Diese DLL befindet sich auf der SQL-Box, aber ich kann sie nicht zu Studio hinzufügen, da sie eine Nachricht gibt, wenn ich versuche, ... Ich habe die Dinge, die ich hier ausprobieren kann. Es ist wieder alles in den 90ern.

29
VBAHole

Ich hatte das gleiche Problem auf einem Windows Server 2012-Computer. Es hatte eine SqlServerSpatial110.dll-Datei in\Windows\System32, aber keine SqlServerSpatial.dll. Die Lösung bestand darin, die Microsoft System CLR-Typen für SQL Server 2008 R2 auf dem Computer zu installieren.

  1. http://www.Microsoft.com/de-de/download/details.aspx?id=26728
  2. Klicken Sie auf Download.
  3. Aktivieren Sie je nach Prozessorarchitektur eines dieser:

    • 1033\x64\SQLSysClrTypes.msi
    • 1033\x86\SQLSysClrTypes.msi
    • 1033\IA64\SQLSysClrTypes.msi 
  4. Klicken Sie auf Weiter.

35
Marcelo Mason

Ihr Problem war ähnlich: Ich habe mein ASP.NET MVC-Projekt auf einer fernen Azure Virtual Machine installiert und habe die folgende Ausnahme erhalten:

"Unable to load DLL 'SqlServerSpatial110.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)" 

Um das Problem zu lösen, habe ich die folgenden Schritte ausgeführt:

  1. Ich habe den Verweis auf das fehlende Paket in meinem Projekt hinzugefügt:

    PM> Install-Package Microsoft.SqlServer.Types
    
  2. Dann habe ich die Option "In Ausgabeverzeichnis kopieren" auf "Immer kopieren" für das SqlServerSpatial110.dll (wahrscheinlich ist dieser Schritt nicht unbedingt erforderlich ...)

  3. Für ASP.NET-Projekte müssen Sie die folgende Codezeile zum Application_Start Methode in Global.asax.cs:

    SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));
    

    Dies letzter Schritt war grundlegend für mich, da ohne diese Codezeile die DLL wird nicht von der Webanwendung geladen.

26
davioooh

Ich verwende Microsoft.SqlServer.Types.dll in WPF- und ASP.NET-Apps seit Jahren (seit Version 10), um mit SqlGeometry-Typ und räumlichen Abfragen zu arbeiten. Hier sind die neuesten Tipps, die ich gefunden habe, um das SqlServerSpatialXXX.dll erfolgreich als eine der Voraussetzungen zu laden des Microsoft.SqlServer.Types.dll.

  • SqlGeometry- und SqlGeography-Typen können in VS-Projekten (z. B. C #) verwendet werden, indem auf Microsoft.SqlServer.Types.dll verwiesen wird.
  • Microsoft.SqlServer.Types.dll ist eine verwaltete Bibliothek und hat einige nicht verwaltete Bibliothek als Voraussetzung, und sie sind wie SqlServerSpatialXXX.dll und msvcrXXX.dll
  • Seit SQL Server 2008 sind verschiedene Versionen von Microsoft.SqlServer.Types.dll verfügbar. Ich sehe jedoch keine Funktionsänderung ab 2012.

64bit/32bit-Probleme in Betracht ziehen

  • Wenn Sie CLR-Typen für SQL Server installieren, finden Sie 64-Bit-Versionen dieser Vorbedingungsdateien in Windows/System32 und 32-Bit-Versionen der Vorbedingungsdateien im Ordner Windows/SysWOW64
  • Wenn CLR-Typen nicht auf einem Computer installiert sind, sollten Sie die richtigen Versionen (32-Bit/64-Bit) dieser Voraussetzungen basierend auf Ihrem Projekt (32-Bit oder 64-Bit) manuell laden. Andernfalls werden Fehler angezeigt

Fehler beim Laden von SqlServerSpatialXXX.dll

Sie können das 32-Bit/64-Bit-Problem zur Laufzeit in C # mit Environment.Is64BitProcess prüfen. Hier ist ein Beispielcode:

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr LoadLibrary(string libname);

private static void LoadNativeAssembly(string nativeBinaryPath, string assemblyName)
{
    var path = Path.Combine(nativeBinaryPath, assemblyName);

    if (!File.Exists(path))
    {
        throw new FileNotFoundException($"{path} not found");
    }

    var ptr = LoadLibrary(path);
    if (ptr == IntPtr.Zero)
    {
        throw new Exception(string.Format(
            "Error loading {0} (ErrorCode: {1})",
            assemblyName,
            Marshal.GetLastWin32Error()));
    }          
}

public static void LoadNativeAssembliesv13(string rootApplicationPath)
{
    var nativeBinaryPath = Environment.Is64BitProcess
    ? Path.Combine(rootApplicationPath, @"SqlServerTypes\x64\")
    : Path.Combine(rootApplicationPath, @"SqlServerTypes\x86\");

    LoadNativeAssembly(nativeBinaryPath, "msvcr120.dll");
    LoadNativeAssembly(nativeBinaryPath, "SqlServerSpatial130.dll");
}

Betrachten Sie den binären Pfad in verschiedenen Projekttypen Es wird empfohlen, einen Ordner mit dem Namen SqlServerTypes im Ausführungspfad Ihres Projekts zu haben

SqlServerTypes> x64

SqlServerTypes> x32

und laden Sie nicht verwaltete Baugruppen wie folgt

Utilities.LoadNativeAssembliesv13(Environment.CurrentDirectory); //WPF
Utilities.LoadNativeAssembliesv13(HttpRuntime.BinDirectory); //ASP.NET 

Probleme bei Verwendung von ADO.NET zum Lesen von SqlGeometry von SQL Server Ungeachtet der verwendeten Version von Microsoft.SqlServer.Types.dll versuchen Sie, lesen Sie sie mithilfe von ADO.NET vom SQL Server aus eine Cast-Ausnahme, da der SQL-Client standardmäßig Version 10.0.0.0 von Microsoft.SqlServer.Types.dll lädt. In diesem Fall habe ich vor einigen Jahren WKB (Ansatz 1 und 2) und WKT als Medium zum Konvertieren zwischen SqlGeometry-Typ für verschiedene Versionen von Microsoft.SqlServer.Types.dll ausprobiert und festgestellt, dass WKB etwa 10-mal schneller ist, aber vor einigen Monaten konnte ich die Umleitung von Assemblys erzwingen Das Programm zum Laden der Version, die wir verwenden, und die Verwendung eines einfachen Casts können wir die SqlGeometry erhalten (Ansatz 3).

private List<SqlGeometry> SelectGeometries(string connectionString)
{
    SqlConnection connection = new SqlConnection(connectionString);
    var command = new SqlCommand(select shapeCol from MyTable, connection);
    connection.Open();
    List<SqlGeometry> geometries = new List<SqlGeometry>();
    SqlDataReader reader = command.ExecuteReader();
    if (!reader.HasRows)
    {
        return new List<SqlGeometry>();
    }
    while (reader.Read())
    {
        //approach 1: using WKB. 4100-4200 ms for hundred thousands of records
        //geometries.Add(SqlGeometry.STGeomFromWKB(new System.Data.SqlTypes.SqlBytes((byte[])reader[0]), srid).MakeValid());
        //approach 2: using WKB. 3220 ms for hundred thousands of records
        //geometries.Add(SqlGeometry.Deserialize(reader.GetSqlBytes(0))); 
        //approach 3: exception occur if you forget proper Assembly redirection. 2565 ms for hundred thousands of records
        geometries.Add((SqlGeometry)reader[0]);
    }
    connection.Close();
    return geometries;
}

Ich hatte Probleme auf einem Windows Server 2008 R2-Computer (Azure VM), aber keiner der oben genannten Schritte konnte das Problem beheben. Ich habe die CLR-Typen installiert. Ich lege die Dateien in den BIN-Ordner meiner Webanwendung. Immer noch nichts. Endlich bin ich auf dieses Blog von den Leuten bei Microsoft gestoßen und es hat funktioniert. Ich lasse die URL hier für den Fall, dass sie anderen helfen kann.

http://blogs.msdn.com/b/adonet/archive/2013/12/09/Microsoft-sqlserver-types-nuget-package-spatial-on-Azure.aspx

Da der obige Link nicht mehr funktioniert (danke MSFT!), Habe ich folgende Anweisungen hinzugefügt:

  1. Öffnen Sie Visual Studio und öffnen Sie den NuGet Package Manager
  2. Suche nach "Microsoft.SqlServer.Types"
  3. Installieren...

Dieses Paket installiert die erforderlichen .DLLs in Ihrer Projektmappe. Es werden auch einige zusätzliche Bibliotheken direkt in Ihr Verzeichnis/bin kopiert. Sie müssen Verweise auf diese zusätzlichen Bibliotheken in Ihrer Datei global.asax.cs/vb zusammenführen. Anweisungen dazu finden Sie im NuGet-Paket. Unten ist ein direkter Link zum NuGet-Paket (hoffentlich bringt MSFT dies auch nicht in Vergessenheit).

https://www.nuget.org/packages/Microsoft.SqlServer.Types/

4
Jason

Obwohl SQL Server 14.x installiert war, bestand VS weiterhin darauf, dass SqlServerSpatial 110 . Dll nicht gefunden wurde.

Bei der Installation der Microsoft-System-CLR-Typen für SQL Server 2008 R2 wurde dies nicht behoben. Ich habe auch versucht, die Version 10.5 von Microsoft.SqlServer.Types zu installieren, erhielt jedoch einen PInvoke-Fehler über die nicht übereinstimmende Methodensignatur.

Stattdessen installierte ich Microsoft.SqlServer.Types 14.x, benannte die Datei SqlServerSpatial 140 . Dll in SqlServerSpatial 110 . Dll in beiden Ordnern/x86 und/x64 um und tat dasselbe in Loader.cs. Aus irgendeinem Grund schien das den Trick zu tun.

3
Adam

Ich hatte das gleiche Problem in Godaddy VPS mit Windows Server 2012 R2

I Resolved it by Updating my EF5 to EF6

führen Sie in der Paket-Manager-Konsole EF5 bis EF lalest aus

Install-Package EntityFramework 
2
John

Entfernen Sie die Microsoft.SqlServer.Types.dll aus den Referenzen und verwenden Sie zur Installation Nuget. Überprüfen Sie Ihre Version vor der Installation. Die Assemblys zu x86 und x64 werden im Projekt installiert.

1
Robson Douglas

Ich hatte ein altes (2009) asp.net webform vb.net Projekt, das mir diesen Fehler auf einem anderen Server gab. Ich musste diese Laufzeit der web.config hinzufügen:

<configuration>
  <runtime>
  <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" />
        <bindingRedirect oldVersion="1.0.0.0-11.0.0.0" newVersion="10.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

http://biandintegration.blogspot.com/2017/12/solved-unable-to-load-dll.html

0

Bei einem ASP.NET MVC 5-Projekt ist ein ähnliches Problem aufgetreten. Vor einiger Zeit musste ich eine Zeile hinzufügen, um den Assembly-Namen wie folgt anzugeben:

SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));
SqlProviderServices.SqlServerTypesAssemblyName = Assembly.GetAssembly(typeof(Microsoft.SqlServer.Types.SqlGeography)).FullName;

Ich habe vor kurzem auf einem neuen Testserver bereitgestellt und diesen Fehler erneut festgestellt. Aus irgendeinem Grund wurde versucht, Version 12 zu laden. Ich gebe jetzt die genaue Version an, die ich möchte, und es funktioniert wie erwartet.

SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));
SqlProviderServices.SqlServerTypesAssemblyName = "Microsoft.SqlServer.Types, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91";

Hoffe das hilft jemandem.

0
Andrew Grothe