Impossible de charger SqlServerSpatial.DLL

j'essaie d'utiliser les types CLR spatiaux SqlServer dans un projet C# .Net. Je veux utiliser la SqlGeometry pour interroger des enregistrements spatiaux de ma base de données.

j'ai ce travail sur ma machine locale dans un test unitaire en cours dans Visual Studio 2010 frapper une machine SqlServer distante. Du tout bon.

je publie alors un service de repos WCF à mon instance IIS locale qui a un service qui frappe la même bibliothèque de classe que le test d'unité pour faire une interrogation spatiale et il échouer.

j'obtiens une erreur en disant:

incapable de charger DLL SqlServerSpatial.dll: le module spécifié pourrait ne pas être trouvé.

j'ai googlé ceci et j'ai trouvé beaucoup, beaucoup de réponses - aucune ne fonctionne pour moi. J'ai:

  • enregistré les types CLR avec le GAC
  • installez le 64-bit, et plus tard aussi, la version 32-bit du VC++
  • essayé de nombreuses variantes de L'utilisation de différents Microsoft.SqlServer.Type versions de dll

la seule chose que je n'ai pas faite, et que je refuse franchement de faire, c'est d'installer quoi que ce soit sur la boîte SqlServer. Cela semble inutile pour moi.

à ce stade, la seule chose qui pourrait causer ceci est un problème de permissions car il tourne dans un pool d'applications IIS et non dans Studio où il fonctionne dans le test de l'unité.

notez que dans mon projet Je ne fais jamais référence à la dll mentionnée dans le message d'erreur. Cette dll est présent sur la boîte sql mais je ne peux pas l'ajouter à studio car il donne un message quand j'essaie de le faire. Je suis à court de choses à faire ici. C'est l'enfer des dll des années 90.

29
demandé sur Hossein Narimani Rad 2013-01-10 23:34:55

7 réponses

j'ai eu le même problème sur une machine Windows Server 2012. Il avait un SqlServerSpatial110.dll fichier dans \Windows\System32, mais pas de SqlServerSpatial.DLL. La solution était d'installer le système Microsoft types CLR pour SQL Server 2008 R2 sur la machine.

  1. http://www.microsoft.com/en-us/download/details.aspx?id=26728
  2. Cliquez sur Télécharger
  3. cochez l'une de ces réponses selon votre processeur architecture:

    • 1033\ x64 \ SQLSysClrTypes.msi
    • 1033\ x86 \ SQLSysClrTypes.msi
    • 1033\IA64 \ SQLSysClrTypes.msi
  4. Cliquez sur

34
répondu Marcelo Mason 2017-02-22 22:10:26

Mon problème était similaire à la vôtre: j'ai installé mon ASP.NET projet MVC sur une distance Azure Virtual Machine et j'ai eu cette exception:

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

Pour résoudre le problème, j'ai suivi ces étapes:

  1. j'ai ajouté la référence pour le paquet manquant dans mon projet:

    PM> Install-Package Microsoft.SqlServer.Types
    
  2. puis j'ai forcé l'option "Copier vers le répertoire de sortie" à "copier toujours" pour le SqlServerSpatial110.dll (probablement cette étape n'est pas strictement requis...)

  3. pour ASP.NET projets, vous devez ajouter la ligne de code suivante à la Application_Start méthode Global.asax.cs:

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

    la dernière étape fondamentale pour moi, parce que sans cette ligne de code de la DLL n'est pas chargé par l'application web.

24
répondu davioooh 2018-08-14 16:20:04

j'ai été en utilisant Microsoft.SqlServer.Types.dll dans le WPF et ASP.NET apps to work with SqlGeometry type et requêtes spatiales depuis des années (depuis v. 10) et voici les dernières astuces que j'ai trouvé pour charger avec succès le SqlServerSpatialXXX.dll comme l'une des conditions préalables de la Microsoft.SqlServer.Types.dll.

  • SqlGeometry et SqlGeography les types peuvent être utilisés dans les projets VS (p. ex. C#) en faisant référence au Microsoft.SqlServer.Types.dll.
  • Microsoft.SqlServer.Types.dll est une bibliothèque gérée et a certaines bibliothèques non gérées comme préalables et ils sont comme SqlServerSpatialXXX.dll et msvcrXXX.dll
  • depuis Sql Server 2008, différentes versions de Microsoft.SqlServer.Types.dll sont disponibles, cependant, je ne vois aucun changement de fonctionnalité à partir de 2012.

Envisager de 64 bits/32 bits

  • pour les machines 64 bits, si vous installez des types CLR pour Sql Server, vous pouvez trouver des versions 64bit de ces fichiers prérequis dans Windows / System32 et aussi vous pouvez trouver des versions 32bit de fichiers prérequis dans Windows / SysWOW64 dossier
  • si les types CLR ne sont pas installés sur une machine, vous devez charger manuellement les versions appropriées (32bit / 64bit) de ces prérequis basés sur votre projet (32bit ou 64bit) sinon vous allez faire des erreurs comme

Erreur Chargement SqlServerSpatialXXX.dll

vous pouvez vérifier l'émission 32bit/64bit à l'exécution dans C# en utilisant Environment.Is64BitProcess. Voici un échantillon code:

[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");
}

Envisager de chemin binaire dans différents types de projet Il est recommandé d'avoir un dossier nommé SqlServerTypes dans le chemin d'exécution de votre projet comme ceci

SqlServerTypes>x64

SqlServerTypes>x32

et de la charge non géré assemblées comme ceci

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

problèmes lors de l'utilisation ADO.NET pour lire SqlGeometry à partir de Sql Server Malgré quelle version de Microsoft.SqlServer.Types.dll vous utilisez, si vous essayez d' les lire depuis le serveur Sql en utilisant ADO.NET vous pouvez rencontrer une exception de cast parce que le Client SQL chargera par défaut la version 10.0.0 de Microsoft.SqlServer.Types.dll. Dans ce cas il y a quelques années j'ai essayé WKB (approche 1 et 2) et WKT comme un moyen de convertir entre SqlGeometry tapez pour une version différente de Microsoft.SqlServer.Types.dll et trouvé WKB est environ 10 fois plus rapide mais il ya quelques mois, j'ai trouvé en utilisant la redirection de l'assemblage, nous pouvons forcer le programme à charger la version que nous utilisons et en utilisant un cast simple nous pouvons obtenir le SqlGeometry (approche 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;
}
7
répondu Hossein Narimani Rad 2017-09-20 03:51:26

j'avais des problèmes sur une machine Windows Server 2008 R2 (Azure VM), mais aucune des étapes ci-dessus n'a pu corriger le problème. J'ai installé les types CLR. J'ai mis les fichiers dans le dossier BIN de mon application web. Toujours rien. Je suis finalement tombé sur ce blog par les gens de Microsoft et il a fonctionné. Je laisse l'url ici au cas où il pourrait aider n'importe qui autre.

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

depuis que le lien ci-dessus ne fonctionne plus (merci MSFT!), J'ai mis les instructions ci-dessous:

  1. Ouvrez Visual Studio et ouvrez le Gestionnaire de Package NuGet
  2. rechercher " Microsoft.SqlServer.Les Types"
  3. Installer...

ce paquet installera le nécessaire .Dll dans votre solution/projet. Il copiera également des bibliothèques supplémentaires directement dans votre répertoire / bin. Vous devez câbler les références à ces bibliothèques supplémentaires dans votre global.asax.fichier cs / vb. Il y a des instructions sur la façon de le faire inclus dans le paquet NuGet. Ci-dessous, un lien direct vers le paquet NuGet (avec un peu de chance, MSFT ne le déplacera pas dans oblivion aussi).

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

4
répondu Jason 2017-01-05 20:07:44

j'ai eu le même problème dans godaddy VPS avec windows server 2012 r2

I Resolved it by Updating my EF5 to EF6

dans la console de gestionnaire de paquets, exécuter EF5 à EF lalest

Install-Package EntityFramework 
2
répondu Fawel 2017-12-16 17:55:15

supprimer le Microsoft.SqlServer.Type.dll à partir de références et utiliser Nuget à instal. Vérifiez votre version avant l'installation. Les assemblages de x86 et x64 seront installés dans le projet.

1
répondu Robson Douglas 2017-06-17 03:17:50

malgré avoir SQL Server 14.x installé, VS maintenu insistant SqlServerSpatial 110.dll n'a pas été trouvé.

Installation Microsoft System CLR Types for SQL Server 2008 R2 n'a pas le fixer. J'ai aussi essayé d'installer la version 10.5 de Microsoft.SqlServer.Types, mais a reçu une erreur PInvoke sur la signature de la méthode ne correspondant pas.

Donc au lieu de cela, j'ai installé Microsoft.SqlServer.Types 14.x, puis renommé le SqlServerSpatial 140.fichier dll vers SqlServerSpatial 110.dll dans les dossiers /x86 et /x64 et fait la même chose dans Loader.cs. Pour une raison quelconque, ça a semblé faire l'affaire.

1
répondu Adam 2018-03-11 06:10:37