无法加载SqlServerSpatial.dll(Unable to load SqlServerS

2019-07-18 02:19发布

我想在C#.NET项目中使用SQLServer的空间CLR类型。 我想用SqlGeometry查询空间记录了我的分贝。

我有我在单元测试运行在本地机器上这个工作在Visual Studio 2010中创下了远程机器的SqlServer。 都好。

然后,我发布一个WCF REST服务,以我的本地IIS实例有碰到相同的类库的单元测试做一些空间查询服务,它失败。

我得到一个错误说

无法加载DLL SqlServerSpatial.dll:指定的模块找不到。

我用Google搜索,发现这个很多很多的答案 - 我没有工作。 我有:

  • 与GAC注册的CLR类型
  • 安装64位,后来还中,VC的32位版本++
  • 尝试使用不同的Microsoft.SqlServer.Types DLL版本的许多变化

我没有做过,并坦率地拒绝这样做的唯一的事情,就是安装在实际的SqlServer框中输入任何内容。 这似乎不需要我。

在这一点上,我能想到是造成这一点的唯一事情是一个权限问题,因为它是在IIS应用程序池,而不是内部的工作室,它工作在单元测试运行。

请注意,在我的项目,我从来没有提及的错误消息中提到的DLL。 该DLL是出现在SQL框,但它提供了一些信息,当我尝试,我不能把它添加到工作室。 我跑出来的东西,试图在这里。 这是90年代的DLL地狱一遍。

Answer 1:

我有一个在Windows Server 2012机器上同样的问题。 它在\ Windows \ System32下的SqlServerSpatial110.dll文件,但没有SqlServerSpatial.dll。 该解决方案是为SQL Server 2008 R2的计算机上安装Microsoft系统CLR类型。

  1. http://www.microsoft.com/en-us/download/details.aspx?id=26728
  2. 点击下载
  3. 请关闭这些取决于你的处理器架构之一

    • 1033 \ 64 \ SQLSysClrTypes.msi
    • 1033 \ 86 \ SQLSysClrTypes.msi
    • 1033 \ IA64 \ SQLSysClrTypes.msi
  4. 点击下一步



Answer 2:

我的问题是类似你们:我安装我的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项目,你需要下面的代码行添加到Application_Start在方法Global.asax.cs

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

    最后一步对我来说根本 ,因为whitout这行代码的DLL不是由Web应用程序加载。



Answer 3:

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

  • SqlGeometrySqlGeography类型可以在VS项目(例如C#)通过参考使用Microsoft.SqlServer.Types.dll
  • Microsoft.SqlServer.Types.dll是一个托管库,并有一些非托管库作为先决条件,他们都喜欢SqlServerSpatialXXX.dllmsvcrXXX.dll
  • 由于SQL Server 2008中,不同版本的Microsoft.SqlServer.Types.dll都可以,不过,我没有看到2012年的任何功能的变化。

考虑64位/ 32位的问题

  • 对于64个machanies,如果你安装了CLR类型对于SQL Server,你可以找到在Windows / System32下这些先决条件文件的64位版本,你也可以找到在Windows / Syswow64资料夹的先决条件文件的32位版本
  • 如果CLR类型是不是一台机器上安装,您应该手动加载基于你的项目(32位或64位),这些先决条件的正确版本(32位/ 64位),否则你会这样的错误

错误加载SqlServerSpatialXXX.dll

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

[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> 64

SqlServerTypes> X32

和负载的非托管组件这样

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

使用ADO.NET时问题,尽管它的版本从SQL Server读取SqlGeometry Microsoft.SqlServer.Types.dll您使用,如果您尝试使用ADO.NET从SQL Server读取它们可能会遇到强制转换异常,因为SQL客户端通过10.0.0.0默认加载版本Microsoft.SqlServer.Types.dll 。 在这种情况下,一些年前,我试过WKB(方法1和2),并作为高铁总站之间转换的媒介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;
}


Answer 4:

我有一个在Windows Server 2008 R2机器(VM天青)上的问题,但没有上述步骤能够解决这个问题。 我安装了CLR类型。 我把文件在我的Web应用程序的bin文件夹。 依然没有。 我终于在微软碰到这个博客走过来的人们和它的工作。 我在这里留下网址的情况下,它可以帮助其他人。

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

由于上面的链接不再工作(!感谢MSFT),我已经把下面的说明:

  1. 打开Visual Studio并打开NuGet包管理器
  2. 搜索“Microsoft.SqlServer.Types”
  3. 安装...

该软件包将安装必要的.DLL文件到您的解决方案/项目。 它也将直接复制一些额外的库到你的/ bin目录。 必须连接起来,以这些附加库的引用您的Global.asax.cs / VB文件。 有关于如何做到这一点列入NuGet包的说明。 下面是一个直接链接到NuGet包(希望MSFT不动被人遗忘这太)。

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



Answer 5:

尽管有安装了SQL Server 14.x,VS一直坚持SqlServerSpatial 110 .dll文件未找到。

为SQL Server 2008 R2并没有解决它安装Microsoft系统CLR类型 。 我也尝试安装10.5版本的Microsoft.SqlServer.Types ,但收到的PInvoke错误有关该方法的签名不匹配。

所以不是我装Microsoft.SqlServer.Types 14.x,然后改名为SqlServerSpatial 140 .dll文件到SqlServerSpatial 110 .dll文件均/ x86和/ X64文件夹,并没有在同一Loader.cs 。 无论出于何种原因,似乎这样的伎俩。



Answer 6:

我在godaddy的VPS与Windows Server 2012 R2相同的问题

I Resolved it by Updating my EF5 to EF6 

在包管理器控制台运行至EF5来到EF lalest

Install-Package EntityFramework 


Answer 7:

从引用删除Microsoft.SqlServer.Types.dll和使用的NuGet来安设。 检查您的版本之前安装。 对x86和x64的组件将被安装在该项目。



Answer 8:

我一直就在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";

希望这可以帮助别人。



文章来源: Unable to load SqlServerSpatial.dll