web-dev-qa-db-fra.com

Impossible de charger SqlServerSpatial.dll

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

Je travaille sur ma machine locale dans un test unitaire exécuté dans Visual Studio 2010 et qui frappe une machine SqlServer distante. Tout bon.

Je publie ensuite un service de repos WCF sur mon instance locale IIS dont le service utilise la même bibliothèque de classes que le test unitaire pour effectuer une interrogation spatiale et échoue.

Je reçois une erreur en disant 

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

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

  • enregistré les types CLR auprès du GAC
  • installer les versions 64 bits et ultérieures également de la version 32 bits de VC++
  • essayé plusieurs variantes d’utilisation de différentes versions de Microsoft.SqlServer.Types dll

La seule chose que je n’ai pas faite et que j’ai franchement refusée, c’est d’installer quoi que ce soit sur la boîte SqlServer. Cela me semble inutile. 

À ce stade, la seule chose qui me semble responsable est un problème d'autorisations, car 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 référence à la DLL mentionnée dans le message d'erreur. Cette dll est présente sur la boîte SQL mais je ne peux pas l’ajouter au studio car cela donne un message lorsque j’essaie de .. .. Je n’ai plus rien à essayer ici. Il est 90 dll enfer tout recommencer.

29
VBAHole

J'ai eu le même problème sur un ordinateur Windows Server 2012. Il y avait un fichier SqlServerSpatial110.dll dans\Windows\System32, mais pas SqlServerSpatial.dll. La solution consistait à installer les types de CLR du système Microsoft pour SQL Server 2008 R2 sur la machine.

  1. http://www.Microsoft.com/en-us/download/details.aspx?id=26728
  2. Cliquez Télécharger
  3. Cochez l'un de ces en fonction de votre architecture de processeur:

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

35
Marcelo Mason

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 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 au paquet manquant dans mon projet:

    PM> Install-Package Microsoft.SqlServer.Types
    
  2. Ensuite, j'ai forcé l'option "Copier dans le répertoire de sortie" sur "Copier toujours" pour le SqlServerSpatial110.dll ( probablement cette étape n'est pas strictement requise ... )

  3. Pour les projets ASP.NET, vous devez ajouter 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.

25
davioooh

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). Voici les dernières astuces que j'ai trouvées pour charger avec succès le SqlServerSpatialXXX.dll parmi les conditions préalables. du Microsoft.SqlServer.Types.dll.

  • Les types SqlGeometry et SqlGeography peuvent être utilisés dans les projets VS (par exemple, C #) en faisant référence au Microsoft.SqlServer.Types.dll.
  • Microsoft.SqlServer.Types.dll est une bibliothèque gérée dont certaines prérequis sont des bibliothèques non gérées, comme SqlServerSpatialXXX.dll et msvcrXXX.dll
  • Depuis Sql Server 2008, différentes versions de Microsoft.SqlServer.Types.dll sont disponibles. Cependant, aucune fonctionnalité ne sera modifiée à partir de 2012.

Considérons les problèmes 64 bits/32 bits

  • Pour les machanies 64 bits, si vous installez CLR Types pour Sql Server, vous pouvez trouver les versions 64 bits de ces fichiers de prérequis dans le dossier Windows/System32 et les versions 32 bits des fichiers de prérequis dans le dossier Windows/SysWOW64.
  • Si les types CLR ne sont pas installés sur une machine, vous devez charger manuellement les versions appropriées (32 bits/64 bits) de ces conditions préalables en fonction de votre projet (32 bits ou 64 bits). Dans le cas contraire, des erreurs telles que

Erreur lors du chargement de SqlServerSpatialXXX.dll

Vous pouvez vérifier le problème 32 bits/64 bits au moment de l'exécution en C # à l'aide de Environment.Is64BitProcess. Voici un exemple de 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");
}

Considérez le chemin binaire dans différents types de projets 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 charger des assemblages non gérés comme celui-ci

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

Problèmes liés à l'utilisation de ADO.NET pour lire SqlGeometry à partir de Sql Server Malgré la version de Microsoft.SqlServer.Types.dll que vous utilisez, si vous essayez de lisez-les à partir de Sql Server en utilisant ADO.NET une exception de distribution, car SQL Client charge par défaut 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 en tant que moyen de conversion entre les types SqlGeometry pour une version différente de Microsoft.SqlServer.Types.dll et que WKB est environ 10 fois plus rapide. le programme pour charger la version que nous utilisons et en utilisant une distribution simple nous pouvons obtenir la 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

Je rencontrais des problèmes sur un ordinateur Windows Server 2008 R2 (machine virtuelle Azure), mais aucune des étapes ci-dessus n'a permis de résoudre le problème. J'ai installé les types CLR. Je mets les fichiers dans le dossier BIN de mon application Web. Toujours rien. Je suis finalement tombé sur ce blog 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-Azure.aspx

Comme 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 paquets NuGet.
  2. Recherchez "Microsoft.SqlServer.Types"
  3. Installer...

Ce paquet installera les fichiers .DLL nécessaires dans votre solution/projet. Il va également copier des bibliothèques supplémentaires directement dans votre répertoire/bin. Vous devez connecter des références à ces bibliothèques supplémentaires dans votre fichier global.asax.cs/vb. Il y a des instructions sur la façon de faire ceci incluses dans le paquet NuGet. Vous trouverez ci-dessous un lien direct vers le package NuGet (si tout va bien, MSFT n’ajoute rien à cela).

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

4
Jason

Bien que SQL Server 14.x soit installé, VS n’a pas cessé d’insister sur le fait que SqlServerSpatial 110 .dll était introuvable.

L'installation de types de CLR système de Microsoft pour SQL Server 2008 R2 ne corrigeait rien. J'ai également essayé d'installer la version 10.5 de Microsoft.SqlServer.Types, mais j'ai reçu une erreur PInvoke à propos de la non correspondance de la signature de méthode.

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

3
Adam

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 paquets, sur EF5 vers EF lalest

Install-Package EntityFramework 
2
John

Supprimez le Microsoft.SqlServer.Types.dll des références et utilisez Nuget pour l'installer. Vérifiez votre version avant l'installation. Les assemblages x86 et x64 seront installés dans le projet.

1
Robson Douglas