无法加载 DLL 文件 'SqlServerSpatial.dll'

16

我有一个.NET MVC Web应用程序,引用 System.Data.Spatial,以便我可以在一些地理定位方面的属性上使用 DbGeography 数据类型。我正在使用带有.NET 4.5的Visual Studio 2012,并且在我的开发机器上没有完整的SQL Server安装(只有localdb)。

该应用程序在本地测试时运行良好,但是当我将其推送到 Azure 时,一旦我的应用程序访问到 DbGeography 属性,就会抛出以下错误:

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

是否有其他人遇到过这个问题?

8个回答

14

SqlServerSpatial.dll是非托管代码。您需要在服务器上安装正确版本(64位)。将DLL添加到您的项目中。将SqlServerSpatial110.dll的属性设置为“复制到输出目录=始终复制”。

您可以在这里找到详细信息。


1
谢谢!我试图添加一个对DLL的引用,但由于它是非托管代码,显然不起作用。我在我的项目中创建了一个Lib目录,并把文件放在那里。 - ryanw51
我正在使用TFS持续集成部署到Azure。我已经添加了SqlServerSpatial.dll甚至是SqlServerSpatial110.dll。我已经将所有内容检入TFS并完成了构建和部署,但仍然遇到相同的问题。 - sacretruth
1
@kooldave98 你看过这个吗?http://alastaira.wordpress.com/2011/08/19/spatial-applications-in-windows-azure-redux-including-denali/ - slfan
这篇博客文章有点老了,但我还是按照它的方法操作了。到了需要向DLL中添加项目引用的步骤时,我就卡住了。Visual Studio无法让我添加该项目引用,因为它被认为是无效或不可访问的。 - sacretruth
1
@IanGrainger 你有引用 Microsoft.SqlServer.Types.dll 吗?你使用的是正确的版本(32/64位)吗? - slfan
显示剩余9条评论

2
<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
  <assemblyIdentity name="Microsoft.SqlServer.Types" 
  publicKeyToken="89845dcd8080cc91" culture="neutral" />
  <bindingRedirect oldVersion="10.0.0.0" newVersion="12.0.0.0" />
  </dependentAssembly>
  </assemblyBinding>
</runtime>

将上述内容放入app.config文件中。根据需要更改newVersion。 - David Chen
这解决了问题。相关主题:https://dev59.com/z1sX5IYBdhLWcg3wHsdv - Sérgio Lopes

2
SQL 2012也会安装此dll文件,但SQL 2014不再安装!您需要在计算机上安装适用于SQL Server 2008 R2的Microsoft System CLR Types。具体步骤如下:
  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. 点击下一步

注意:根据的评论,您需要根据您的IIS安装正确的版本。显然,IIS Express默认以32位模式运行。


我做了这件事,但没有任何改变。 - Ian Grainger
2
嗨,@Mahmoodvcs - 请您更新一下这个答案,提到它取决于您的IIS/IIS Express架构!我安装了适合我的架构(64位)的正确版本,但是IIS Express默认运行在32位模式下! - Ian Grainger
1
这个答案的大部分文本来自https://dev59.com/wGYq5IYBdhLWcg3wtCvO#14797013,但没有标注出处。 - GSerg

1
我遇到了这个问题,缺少SqlServerSpatial110.dll文件。
最终我按照这里的指示进行操作:

http://dllyes.com/sqlserverspatial110-dll/

基本上,您需要获取那个.dll文件,然后
将SqlServerSpatial110.dll放置在\Windows\System32中(通常位于 磁盘C),如果您正在运行32位Windows。如果您正在运行64位 Windows,还需要将文件放置在\Windows\SysWOW64中。

这对我有用。我使用NuGet将SqlServerTypes程序集下载到我的解决方案中,但当我运行EntityFramework命令Add-Migration时,它找不到SqlServerSpatial140.dll。我的IIS是32位的,但我的Windows架构是64位的,所以我必须将32位dll复制到C:\Windows\SysWOW64中。如果您运行Add-Migration命令并获得System.BadImageFormatException,则具有64位dll而应该是32位的。 - nightwuffle

0

我花了相当长的时间在这个问题上苦苦挣扎,我安装了所需的文件,但它仍然不起作用。

显然,该项目想要使用x86的SqlServerSpatial.dll 所以我在Tools>Options>WebProjects>Use the 64 bit IIS中将IIS Express Build更改为x64 这是屏幕截图

没有必要添加新的nuget包,只需要从微软页面安装SQLSysClrTypes:http://go.microsoft.com/fwlink/?LinkID=188391&clcid=0x409 就可以解决问题了 ;)

希望能对有需要的人有所帮助!


0

请确保您的dll文件(例如"sqlserverspatial110.dll","sqlserverspatial120.dll"等)位于此路径"C:\Windows\SysWOW64"中;


-1
I had the same issue in godaddy VPS with windows server 2012 r2

我通过将EF5更新到EF6来解决了这个问题。 在程序包管理器控制台中运行以将EF5更新为最新的EF版本。
Install-Package EntityFramework 

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

有关详细解决方案,您可能想查看我在另一个类似帖子上的答案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接