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

38

这对我来说都是新的,所以请耐心等待...

我正在处理一个Visual Studio项目;它是一个返回一些数据的Web服务。

我刚刚尝试在我的本地机器(IIS)上对Web服务器进行特定调用,但我遇到了以下错误:

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

在有人说之前 - 是的,显然我缺少了这个DLL文件。我已经在网上搜索过并没有找到从哪里下载它(我已经安装了Microsoft SQL Server System CLR Types(x64)和非X64。我已经安装了Microsoft System CLR Types for SQL Server 2014 和 2016)

有人知道如何解决这个问题吗?有人知道我是否可以从某个地方下载此文件吗?


1
SqlServerSpatial140.dll已被NPM移除,因为它是恶意的。如果您已安装,请删除它并安装适用于此应用程序的正确库。 - OverBakedToast
11个回答

30

如果您看到类似以下的错误提示:

由于找不到,因此无法复制文件"…\SqlServerTypes\x64\SqlServerSpatial140.dll"

若您已经通过NuGet安装Microsoft.SqlServer.Types库,并且本地可以正常运行,但在Azure DevOps构建时出现错误,则只需要将dll文件添加到源代码控制中即可。正如@Pure.Krome所指出的那样,这些dll文件在本地的位置如下图所示:

enter image description here

然而,默认情况下这些dll文件被忽略(左侧为红色图标)。请右键单击被忽略的dll文件,然后选择添加被忽略的文件到源代码控制...,接着提交更改并推送到服务器,最后再次构建即可!注意:您的解决方案可能包含多个项目,每个项目都可能有自己的SqlServerTypes文件夹。


3
根据你的.gitignore文件,你可能需要添加以下两行内容:1)!**/SqlServerTypes/x64/ 和 2)!**/SqlServerTypes/x86/ - Metro Smurf
当我从git拉取源代码时,发生了这种情况。标准的Visual Studio .gitignore阻止了文件第一次被检入,因此任何拉取代码的人都没有它们,他们的副本无法编译。必须删除并添加SqlServer Types nuget包,然后像上面提到的那样将它们添加到源代码控制中,以便将来其他人可以使用它们。 - Andy S.

28

将dll从C:\Users\\.nuget\packages\Microsoft.SqlServer.Types\14.0.314.76\nativeBinaries\x86复制到您的项目中。右键单击该文件,然后点击属性。将“复制到输出目录”设置为“始终复制”。


7
  1. 此选项不适用于NuGet软件包。
  2. 部署到服务器时会发生什么?
- Shimmy Weitzhandler

24
安装Microsoft.SqlServer.Types NuGet包后,应该在根目录下创建一个新文件夹。
\SqlServerTypes
   |_x64
   |_x86

应该包含适当的dll。它也会自动设置为“仅在新文件较新时复制”。

然后,确保您的应用程序加载正确的程序集:

  • 对于ASP.NET Web应用程序:SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));
  • 对于桌面应用程序/其他应用程序:SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);

不确定这是否适用于.NET Core。


1
我似乎找不到 SqlServerTypes 类。 - Shimmy Weitzhandler
2
安装了Microsoft.SQLServer.Types nuget包之后,msvcr120.dll和SqlServerSpatial140.dll文件被添加到解决方案中,但未添加到源代码控制中,这就是为什么我们在检入TFS时遇到了类似的问题(或者没有遇到的情况)。在构建服务器上构建之前,请确保将这些dll文件检入源代码控制。 - ChirpingPanda
在我的开发电脑上,我无法在Visual Studio 2019中添加对SqlServerSpatial140.dll的x86或x64版本的引用,以便我可以将该DLL标记为需要复制到本地机器的DLL。错误是:“无法添加对{DLL路径}的引用。请确保文件可访问,并且是有效的程序集或COM组件。” - Tim
一旦我将Spatial DLL从x86文件夹移动到bin文件夹,我就能够添加对它的引用。然而,我仍然无法添加对“msvcr120.dll”的引用。与上述相同的错误。 - Tim
对于没有 SqlServerTypes 类的人,你也应该复制那个 Loader.cs 文件。 - Éric Bergeron
显示剩余4条评论

6

我的问题与git有关:我从TFS上克隆了一个新的解决方案,但似乎出现了问题,尽管我的同事们没有遇到任何问题。在我的情况下,“重置”就解决了问题:

  • 卸载nuget Microsoft.SqlServer.Types 14.0.314.76
  • 清除/重建项目
  • 安装nuget Microsoft.SqlServer.Types 14.0.314.76
  • 清除/重建项目

这个和Design.Garden的回答是在拉取一个没有将程序集提交到源代码控制的新项目时所需的。 - Metro Smurf

4
我曾经遇到过这个问题,但我找到了解决方案。我的一些新实体具有System.Data.Entity.Spatial.DbGeometry类型,当我运行Add-Migration命令时,我一直收到System.DllNotFoundException:无法加载DLL'SqlServerSpatial140.dll'的异常。我已经从Nuget安装了SqlServerTypes库,它在我的解决方案中放置了一个文件夹(与@mattavatar的帖子所示),但我仍然收到异常。
对我有效的方法是将这些DLL复制到C:\ Windows \ SysWOW64。这取决于您的计算机架构和IIS配置。我的计算机是64位的,但IIS配置为运行32位应用程序。在这种情况下,我必须将32位dll复制到C:\ Windows \ SysWOW64。如果您正在运行32位计算机,则需要将32位dll复制到C:\ Windows \ System32。如果您将64位dll复制到32位dll预期的位置,并运行Add-Migration命令,则会出现System.BadImageFormatException。
希望这能对某人有所帮助。我花了很长时间才解决这个问题。感谢@pflous的评论 https://dev59.com/5GQn5IYBdhLWcg3wZGV4#39009634

这对我有效。之前安装的SQL Server将DLL文件放入了这些文件夹中,但是我安装的SQL Server版本与应用程序尝试加载的版本不同。 - Justin

3
我成功的方法是前往以下文件位置并将 SqlServerSpatial240.dll 复制到我的项目bin文件夹中。
C:\Users\\.nuget\packages\microsoft.sqlserver.types\14.0.1016.290\nativeBinaries\x64

3
我用以下命令在包管理器控制台中解决了这个问题:
Update-Package -Reinstall Microsoft.SqlServer.Types

输出包含了一些看起来很严重的警告和错误,但最终表明该软件包已成功安装。并且构建错误消失了。

3

通过以下步骤最终解决了问题。

  1. 卸载 SqlServer.Types Nuget 包

  2. 重新安装 SqleErver.Types Nuget 包(主要是为了确保 dll 被正确上传)

  3. 验证是否已创建 SqlServerTypes 文件夹,并验证 x64/x86 文件夹中是否含有 dll,如果未加载,请右键单击,选择 git,然后点击添加

  4. 确认您的文件夹中是否有一个 Loader.cs 文件,并打开它验证其是否引用了正确的 dll。

  5. 最后,在 Global.asax.cs 文件中执行此步骤,这是我发现解决问题的关键。在 Application_Start() 中添加以下行:

#if DEBUG

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

#endif


1
在我的情况下,最终解决了问题:
  1. 将整个解决方案升级到EntityFramework 6.4.4
  2. 将nuget Microsoft.SqlServer.Types升级到160.1000.6
  3. 删除任何对SqlServerTypes.Utilities.LoadNativeAssemblies的引用

1
非常感谢,它对我非常有效。我在这上面浪费了很多时间,但是你救了我!:)
我将其添加到我的Global.asax.cs中 =>
 `protected void Application_Start()
    {
     SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));`

在我的解决方案资源管理器中,切换到“显示所有文件”并将被忽略的文件添加到源代码控制中,就像Pure.Krone所说的那样。

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