Impossible de charger SqlServerSpatial.dll

J'essaie d'utiliser les types SqlServer Spatial CLR dans un projet C # .Net. Je veux utiliser SqlGeometry pour interroger les loggings spatiaux de ma database.

J'ai ceci fonctionnant sur ma machine locale dans un test d'unité s'exécutant dans Visual Studio 2010 frappant une machine SqlServer distante. Tout bon.

Je publie ensuite un service WCF Rest à mon instance IIS locale qui a un service qui frappe la même bibliothèque de classs que le test unitaire pour effectuer une requête spatiale et échoue.

J'ai une erreur en disant

Impossible de charger la DLL SqlServerSpatial.dll: Le module spécifié est introuvable.

J'ai googlé ceci et trouvé beaucoup, beaucoup de réponses – aucun travail pour moi. J'ai:

  • enregistré les types CLR avec le GAC
  • installer le 64 bits, et plus tard, la version 32 bits du VC ++
  • essayé de nombreuses variantes d'utilisation de différentes versions dll Microsoft.SqlServer.Types

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 boite SqlServer. Cela me semble inutile.

À ce stade, la seule chose que je peux penser est causant ceci est un problème d'permissions parce qu'il s'exécute dans un pool d'applications IIS et non dans Studio où il fonctionne dans le test unitaire.

Notez que dans mon projet je ne fais JAMAIS reference à la DLL mentionnée dans le message d'erreur. Cette dll est présente sur la boite sql mais je ne peux pas l'append en studio car elle donne un message quand j'essaye de le faire. Je suis à court de choses à essayer ici. C'est l'enfer des années 90 encore et encore.

J'ai eu le même problème sur une machine Windows Server 2012. Il avait un file SqlServerSpatial110.dll dans \ Windows \ System32, mais pas SqlServerSpatial.dll. La solution consistait à installer les types CLR Microsoft System 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 options en fonction de l'architecture de votre processeur:

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

Mon problème était similaire au vôtre: j'ai installé mon projet ASP.NET MVC sur une machine virtuelle Azure distante et j'ai toujours obtenu 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 reference au package manquant dans mon projet:

     PM> Install-Package Microsoft.SqlServer.Types 
  2. Puis j'ai forcé l'option "Copy to output directory" à "Copy always" pour le SqlServerSpatial110.dll ( probablement cette étape n'est pas ssortingctement nécessaire … )

  3. Pour les projets ASP.NET, vous devez append la ligne de code suivante à la méthode Application_Start dans Global.asax.cs :

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

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

J'utilise Microsoft.SqlServer.Types.dll dans les applications WPF et ASP.NET pour travailler avec le type SqlGeometry et les requêtes spatiales depuis des années (depuis la v.10) et voici les derniers conseils que j'ai trouvés pour charger le SqlServerSpatialXXX.dll avec succès SqlServerSpatialXXX.dll l'un des prérequirejs de Microsoft.SqlServer.Types.dll .

  • SqlGeometry types SqlGeometry et SqlGeography peuvent être utilisés dans les projets VS (par exemple C #) en faisant reference à Microsoft.SqlServer.Types.dll .
  • Microsoft.SqlServer.Types.dll est une bibliothèque gérée et possède une bibliothèque non gérée comme prérequirejs 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 aucune modification de la fonctionnalité à partir de 2012.

Envisager des problèmes 64 bits / 32 bits

  • Pour les machanies 64 bits, si vous installez les types CLR pour SQL Server, vous findez des versions 64 bits de ces files prérequirejs dans Windows / System32 et vous findez également des versions 32 bits des files prérequirejs dans le dossier Windows / SysWOW64
  • Si les types CLR ne sont pas installés sur une machine, vous devez charger manuellement les versions correctes (32bit / 64bit) de ces prérequirejs en fonction de votre projet (32bit ou 64bit) sinon vous aurez des erreurs comme

Erreur lors du chargement de SqlServerSpatialXXX.dll

Vous pouvez vérifier le problème 32 bits / 64 bits lors de l'exécution en C # en utilisant Environment.Is64BitProcess . Voici un exemple de code:

 [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr LoadLibrary(ssortingng libname); private static void LoadNativeAssembly(ssortingng nativeBinaryPath, ssortingng 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(ssortingng.Format( "Error loading {0} (ErrorCode: {1})", assemblyName, Marshal.GetLastWin32Error())); } } public static void LoadNativeAssembliesv13(ssortingng rootApplicationPath) { var nativeBinaryPath = Environment.Is64BitProcess ? Path.Combine(rootApplicationPath, @"SqlServerTypes\x64\") : Path.Combine(rootApplicationPath, @"SqlServerTypes\x86\"); LoadNativeAssembly(nativeBinaryPath, "msvcr120.dll"); LoadNativeAssembly(nativeBinaryPath, "SqlServerSpatial130.dll"); } 

Considérer le path binary dans différents types de projets Il est recommandé d'avoir un dossier nommé SqlServerTypes dans le path d'exécution de votre projet comme ceci

SqlServerTypes> x64

SqlServerTypes> x32

et charger des assemblages non gérés comme celui-ci

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

Problèmes lors de l'utilisation de ADO.NET pour lire SqlGeometry à partir de Sql Server Malgré la version de Microsoft.SqlServer.Types.dll vous utilisez, si vous essayez de les lire depuis Sql Server à l'aide d'ADO.NET, vous pouvez rencontrer une exception de dissortingbution car SQL Client par défaut, chargez la version 10.0.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 moyen de convertir entre type SqlGeometry pour la version différente de Microsoft.SqlServer.Types.dll et trouvé WKB est environ 10 fois plus rapide mais il y a quelques mois j'ai trouvé En utilisant la redirection d'assemblage, nous pouvons forcer le programme à charger la version que nous utilisons et en utilisant une dissortingbution simple, nous pouvons get le SqlGeometry (approche 3)

 private List<SqlGeometry> SelectGeomesortinges(ssortingng connectionSsortingng) { SqlConnection connection = new SqlConnection(connectionSsortingng); var command = new SqlCommand(select shapeCol from MyTable, connection); connection.Open(); List<SqlGeometry> geomesortinges = 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 //geomesortinges.Add(SqlGeometry.STGeomFromWKB(new System.Data.SqlTypes.SqlBytes((byte[])reader[0]), srid).MakeValid()); //approach 2: using WKB. 3220 ms for hundred thousands of records //geomesortinges.Add(SqlGeometry.Deserialize(reader.GetSqlBytes(0))); //approach 3: exception occur if you forget proper assembly redirection. 2565 ms for hundred thousands of records geomesortinges.Add((SqlGeometry)reader[0]); } connection.Close(); return geomesortinges; } 

J'avais des problèmes sur une machine Windows Server 2008 R2 (Azure VM), mais aucune des étapes ci-dessus n'a été capable de résoudre le problème. J'ai installé les types CLR. J'ai mis les files dans le dossier BIN de mon application web. Toujours rien. J'ai finalement rencontré ce blog par les gens de Microsoft et cela a fonctionné. Je laisse l'URL ici au cas où cela pourrait aider quelqu'un d'autre.

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

Puisque 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 packages NuGet
  2. Rechercher "Microsoft.SqlServer.Types"
  3. Installer…

Ce package va installer les files .DLL nécessaires dans votre solution / projet. Il copyra également certaines bibliothèques supplémentaires directement dans votre directory / bin. Vous devez connecter des references à ces bibliothèques supplémentaires dans votre file global.asax.cs / vb. Il y a des instructions sur la façon de faire cela inclus dans le package NuGet. Vous findez ci-dessous un lien direct vers le package NuGet (heureusement MSFT ne le met pas non plus dans l'oubli).

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

Supprimez le Microsoft.SqlServer.Types.dll de references et utilisez Nuget pour installer. Vérifiez votre version avant l'installation. Les assemblys vers x86 et x64 seront installés dans le projet.

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 du gestionnaire de packages, exécutez EF5 à EF lalest

 Install-Package EntityFramework