Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法加载SqlServerSpatial.dll_C#_.net_Sql Server_Clr_Geospatial - Fatal编程技术网

C# 无法加载SqlServerSpatial.dll

C# 无法加载SqlServerSpatial.dll,c#,.net,sql-server,clr,geospatial,C#,.net,Sql Server,Clr,Geospatial,我试图在C#.Net项目中使用SqlServer Spatial CLR类型。 我想使用SqlGeometry从数据库中查询空间记录 在VisualStudio2010中运行的一个单元测试中,我在本地机器上运行了这项功能,并在远程SqlServer机器上运行。一切都好 然后,我将一个WCF Rest服务发布到本地IIS实例,该实例具有一个与单元测试命中相同类库的服务,以执行一些空间查询,但失败了 我听到一个错误说 无法加载DLL SqlServerSpatial.DLL:指定的模块无法加载 找不

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

在VisualStudio2010中运行的一个单元测试中,我在本地机器上运行了这项功能,并在远程SqlServer机器上运行。一切都好

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

我听到一个错误说

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

我在谷歌上搜索了这个,找到了很多很多答案——没有一个对我有用。 我有:

  • 已向GAC注册CLR类型
  • 安装64位以及更高版本的32位版本的VC++
  • 尝试了使用不同Microsoft.SqlServer.dll版本的多种变体
我唯一没有做的事情,坦率地说拒绝做的事情,就是在实际的SqlServer机器上安装任何东西。这对我来说似乎没有必要

在这一点上,我认为唯一的原因是权限问题,因为它运行在IIS应用程序池中,而不是在Studio中,它在单元测试中工作

请注意,在我的项目中,我从未引用错误消息中提到的dll。该dll存在于sql框中,但我无法将其添加到studio,因为当我尝试添加时,它会给出一些消息。
我这里的东西都快用完了。又是90年代的dll地狱。

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

  • 单击下载
  • 根据您的处理器架构,勾选其中一个

    • 1033\x64\SQLSysClrTypes.msi
    • 1033\x86\SQLSysClrTypes.msi
    • 1033\IA64\SQLSysClrTypes.msi
  • 单击下一步


  • 我在Windows Server 2008 R2计算机(Azure VM)上遇到问题,但上述步骤都无法修复该问题。我安装了CLR类型。我将文件放在web应用程序的BIN文件夹中。还是没什么。我终于在微软的同事们那里看到了这个博客,它很管用。我把url留在这里,以防它能帮助其他人

    由于上面的链接不再有效(感谢MSFT!),我将说明放在下面:

  • 打开Visual Studio并打开NuGet包管理器
  • 搜索“Microsoft.SqlServer.Types”
  • 安装
  • 此软件包将在您的解决方案/项目中安装必要的.dll。它还会将一些附加库直接复制到/bin目录中。必须在global.asax.cs/vb文件中连接对这些附加库的引用。NuGet包中包含了有关如何执行此操作的说明。下面是NuGet软件包的直接链接(希望MSFT不会将其也遗忘)


    我的问题与你的问题类似:我在远程Azure虚拟机上安装了我的ASP.NET MVC项目,但出现了以下异常:

    "Unable to load DLL 'SqlServerSpatial110.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)" 
    
    为了解决这个问题,我遵循以下步骤:

  • 我在项目中添加了对缺少的包的引用:

    PM> Install-Package Microsoft.SqlServer.Types
    
  • 然后我强制将
    SqlServerSpatial110.dll的“复制到输出目录”选项设置为“始终复制”(这个步骤可能不是严格要求的…

  • 对于ASP.NET项目,您需要将以下代码行添加到
    Global.asax.cs
    中的
    Application\u Start
    方法中:

    SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));
    
    最后一步对我来说是基本的,因为没有这行代码,DLL不会被web应用程序加载


  • 多年来,我一直在WPF和ASP.NET应用程序中使用
    Microsoft.SqlServer.Types.dll
    来处理
    SqlGeometry
    类型和空间查询(从第10版开始)下面是我发现的成功加载
    SqlServerSpatialXXX.dll
    的最新技巧,它是
    Microsoft.SqlServer.Types.dll
    的先决条件之一

    • SqlGeometry
      SqlGeometry
      类型可以通过引用
      Microsoft.SqlServer.types.dll
      在VS项目(例如C#)中使用
    • Microsoft.SqlServer.Types.dll
      是一个托管库,并且有一些非托管库作为先决条件,它们类似于SqlServerSpatialXXX.dll和msvcrXXX.dll
    • 自Sql Server 2008以来,Microsoft.Sql Server.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的文件夹,如下所示

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

    SqlServerTypes>x32

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

    Utilities.LoadNativeAssembliesv13(Environment.CurrentDirectory); //WPF
    Utilities.LoadNativeAssembliesv13(HttpRuntime.BinDirectory); //ASP.NET 
    
    使用ADO.NET从Sql Server读取SqlGeometry时出现的问题 无论您使用的是Microsoft.SqlServer.Types.dll的哪个版本,如果您尝试使用,可能会遇到错误
    I Resolved it by Updating my EF5 to EF6
    
    Install-Package EntityFramework 
    
    SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));
    SqlProviderServices.SqlServerTypesAssemblyName = Assembly.GetAssembly(typeof(Microsoft.SqlServer.Types.SqlGeography)).FullName;
    
    SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));
    SqlProviderServices.SqlServerTypesAssemblyName = "Microsoft.SqlServer.Types, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91";
    
    <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>