无法加载sqlserverspace .dll

本文关键字:dll sqlserverspace 加载 | 更新日期: 2023-09-27 17:51:12

我试图在c# . net项目中使用SqlServer空间CLR类型。我想使用SqlGeometry从我的数据库中查询空间记录。

我有这个工作在我的本地机器在Visual Studio 2010运行的单元测试击中远程SqlServer机器。所有好。

然后我将一个WCF Rest服务发布到我的本地IIS实例,该实例有一个服务,该服务与单元测试相同的类库进行一些空间查询,但它失败了。

我得到一个错误说

无法加载DLL sqlserverspace . DLL:指定的模块可以Not be found.

我在谷歌上搜索了这个问题,发现了很多很多答案——没有一个适合我。我:

  • 向GAC
  • 注册CLR类型
  • 安装64位,后来也安装了32位版本的vc++
  • 尝试使用不同版本的Microsoft.SqlServer.Types dll

我唯一没有做的事情,坦率地说,我拒绝做的事情,就是在实际的SqlServer机器上安装任何东西。这对我来说似乎没有必要。

在这一点上,我唯一能想到的是导致这是一个权限问题,因为它是在IIS应用程序池中运行,而不是在Studio中,它在单元测试中工作。

请注意,在我的项目中,我从未引用错误消息中提到的dll。dll是存在于sql框,但我不能把它添加到工作室,因为它给了一些消息,当我尝试。我已经没有什么可尝试的了。90年代的dll地狱又重演了。

无法加载sqlserverspace .dll

我在Windows Server 2012机器上遇到了同样的问题。它在'Windows'System32中有SqlServerSpatial110.dll文件,但没有SqlServerSpatial110.dll。解决方案是在机器上安装Microsoft System CLR Types for SQL Server 2008 R2。

  1. http://www.microsoft.com/en-us/download/details.aspx?id=26728
  2. 点击
  3. 根据您的处理器架构选择以下中的一个:

      1033年
    • ' x64 ' SQLSysClrTypes.msi
    • 1033年
    • ' x86 ' SQLSysClrTypes.msi
    • 1033年
    • ' IA64 ' SQLSysClrTypes。msi
  4. 点击

我的问题与您的相似:我安装了我的ASP。. NET MVC项目在远程Azure虚拟机上,我得到了这个异常:

"Unable to load DLL 'SqlServerSpatial110.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)" 
为了解决这个问题,我遵循了以下步骤:
  1. 我在我的项目中添加了对缺失包的引用:

    PM> Install-Package Microsoft.SqlServer.Types
    
  2. 然后我强制"复制到输出目录"选项为SqlServerSpatial110.dll的"始终复制"(可能这一步不是严格要求的…)

  3. ASP。. NET项目中,您需要在Global.asax.cs中的Application_Start方法中添加以下代码行:

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

    最后一步对我来说是最基本的,因为没有这行代码,web应用程序无法加载DLL。

我一直在WPF和ASP中使用Microsoft.SqlServer.Types.dll。. NET应用程序与SqlGeometry类型和空间查询工作多年(从v.10开始),这里是我发现的最新提示,成功加载 SqlServerSpatialXXX.dll 作为Microsoft.SqlServer.Types.dll的先决条件之一。

  • SqlGeometrySqlGeography类型可以通过引用Microsoft.SqlServer.Types.dll在VS项目中使用(例如c#)。
  • Microsoft.SqlServer.Types.dll是一个托管库,并且有一些非托管库作为先决条件,它们像SqlServerSpatialXXX.dllmsvcrXXX.dll
  • 自Sql Server 2008以来,Microsoft.SqlServer.Types.dll的不同版本是可用的,然而,我没有看到任何功能变化从2012年开始。

考虑64位/32位问题

  • 对于64位机器,如果您安装Sql Server的CLR类型,您可以在Windows/System32中找到这些先决条件文件的64位版本,也可以在Windows/SysWOW64文件夹
  • 中找到32位版本的先决条件文件
  • 如果机器上没有安装CLR类型,您应该根据您的项目(32位或64位)手动加载这些先决条件的适当版本(32位/64位),否则您将出现如下错误

加载SqlServerSpatialXXX.dll出错

您可以使用Environment.Is64BitProcess在c#运行时检查32位/64位问题。下面是一个示例代码:

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

考虑不同项目类型的二进制路径建议在项目的执行路径中有一个名为SqlServerTypes的文件夹,如下所示

SqlServerTypes> x64

SqlServerTypes> x32

并像这样加载非托管程序集

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

使用ADO时的问题。从Sql Server读取SqlGeometry尽管哪个版本的Microsoft.SqlServer.Types.dll你正在使用,如果你试图从Sql Server使用ADO读取它们。你可能会遇到强制转换异常,因为SQL客户端默认会加载Microsoft.SqlServer.Types.dll的10.0.0.0版本。在这种情况下,几年前我尝试了WKB(方法1和2)和WKT作为在SqlGeometry类型之间转换不同版本的Microsoft.SqlServer.Types.dll的媒介,发现WKB大约快10倍,但几个月前我发现使用汇编重定向,我们可以强制程序加载我们正在使用的版本,并使用简单的强制转换,我们可以获得SqlGeometry(方法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;
}

尽管有SQL Server 14。安装sqlserverspace 110.dll时,VS一直坚持找不到。

安装Microsoft System CLR Types for SQL Server 2008 R2没有修复它。我也尝试安装Microsoft.SqlServer.Types的10.5版本,但收到一个关于方法签名不匹配的PInvoke错误。

所以,我安装了Microsoft.SqlServer.Types 2014。然后将/x86和/x64文件夹中的SqlServerSpatial140.dll重命名为SqlServerSpatial110.dll,并在Loader.cs中进行相同的操作。不管出于什么原因,这似乎奏效了。

我在Windows Server 2008 R2机器(Azure VM)上遇到问题,但上述步骤都无法解决问题。我安装了CLR类型。我把文件放在我的web应用程序的BIN文件夹中。还是什么都没有。我终于看到了微软的人写的这个博客,它起作用了。我把网址留在这里,以防对其他人有帮助。

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

我在下面写了说明:

    打开Visual Studio,打开NuGet包管理器
  1. 搜索"Microsoft.SqlServer.Types"
  2. 安装…

此包将在您的解决方案/项目中安装必要的. dll。它还会将一些额外的库直接复制到/bin目录中。您必须在global.asax.cs/vb文件中连接对这些附加库的引用。NuGet包中有关于如何做到这一点的说明。下面是NuGet包的直接链接(希望微软不要把它也遗忘了)。

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

我在windows server 2012 r2的godaddy VPS中遇到了同样的问题

I Resolved it by Updating my EF5 to EF6

在包管理器控制台运行到EF5到EF最小

Install-Package EntityFramework 

我有一个旧的(2009)asp.net webform vb.net项目,在另一个服务器上给了我这个错误。我必须将这个运行时添加到web中。配置:

<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

从参考文件中删除Microsoft.SqlServer.Types.dll并使用Nuget安装。安装前检查你的版本。项目将安装x86和x64的程序集

我一直在ASP上遇到类似的问题。NET MVC 5项目。不久前,我不得不添加一行来指定程序集名称,如下所示:

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

我最近部署到一个新的测试服务器,又得到了这个错误。由于某种原因,它试图加载版本12。现在我指定了我想要的确切版本,它就像预期的那样工作了。

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

希望这能帮助到别人。

导致我出现这个问题的原因:-

在我的项目中有一个名为SQLServerTypes的文件夹,当我在文件夹内查看时,我发现.dll实际上丢失了。所以下载。dll并将其粘贴到SQLServerTypes文件夹中为我解决了这个问题。

当我试图构建我的应用程序时,这个问题发生在我身上。