每当我将应用程序保存到DB时,我的应用程序就会出现以下错误。
无法在DLL 'SqlServerSpatial110.dll‘中找到名为“SetClrFeatureSwitchMap”的入口点。
昨天下午,在Windows和PC重新启动之后,这个错误开始了。dll不在项目中引用,也不在bin文件夹中。
我使用EF5,我可以连接到DB和拉数据,但是当我调用ObjectContext.SaveChanges()时会发生错误。
这个应用程序不使用几何学,所以我不知道它是从哪里来的。
发布于 2015-12-23 08:11:52
我也有同样的问题,并通过在我的应用程序的web.config中添加以下行来修正它:
<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>
这迫使EntityFramework使用SqlServer.Types.dll的版本10,它显然没有几何类型。
发布于 2019-09-27 07:02:44
上面的答案对我没有用,所以我做了更多的调查,并在这里分享我的发现。
汇总:Server 2012 SP2 (11.0.2100.60)和SP3 (11.0.6020.0)之间的Microsoft系统CLR类型 (SQLSysCLRTypes.msi
)库发生了更改,可以通过将此包和任何丢失的DLL升级到最新版本(在编写本报告时对应于2012年SP4 / 11.0.7001.0 )来解决此问题。
这个包中实际上只有两件事:
Microsoft.SqlServer.Types.dll
- .NET包装器库SqlServerSpatial110.dll
-包含空间功能的本机库请注意,大量版本的SQLSysCLRTypes.msi
是可用的,对应于Server的每个主要/次要版本,但令人烦恼的是,它们都是以相同的文件名发布的,除非您执行完整的Server安装,否则它们往往是从Server功能包安装东西的手动先决条件(例如,请参阅https://www.microsoft.com/en-us/download/details.aspx?id=56041)。
从该包的SQL 2012 SP3版本开始,SqlServerSpatial110.dll
导出函数SetClrFeatureSwitchMap
,该函数从.NET包装器DLL中的某个地方调用。在SP3之前,该函数似乎不存在,.NET包装器也没有尝试使用它。(可以使用dumpbin /exports <dll file>
列出DLL导出)
如果CLR类型的MSI包安装在特定的计算机上,并且.NET程序的工作目录中有一个不同的次要版本的DLL,那么您可以得到错误。这很容易发生,如果您分发您的程序及其依赖库,以避免额外的安装步骤为最终用户。
每当.NET库安装到系统并包含在全局程序集缓存(GAC)中时,系统版本将始终由.NET程序加载,即使在工作目录中可以找到“本地”副本。对于本机库,首先使用工作目录副本。这意味着,当您在应用程序中引用Microsoft.SqlServer.Types
并在应用程序目录中同时具有匹配版本的DLL时,如果Microsoft.SqlServer.Types
安装在系统上的主版本相同(即。( 11.0.0.0),当它试图加载其本机库依赖项并从工作目录获得一个较旧版本的SqlServerSpatial110.dll
时可能会出现问题,而不是从系统上可能安装的任何地方获得正确的版本。
How to Fix:确保SqlServerSpatial110.dll
的任何副本都具有与任何Microsoft.SqlServer.Types.dll
副本相同的次要版本,并确保每个副本都有最新版本。这可能只适用于Server 2012,但在最新版本的Server中可能会出现类似的问题,并最终发布Service。
请注意,为引用Microsoft.SqlServer.Types
(在Visual中)将“特定版本”设置为"True“不会产生效果,因为所有Server 2012 CLR类型库版本都向.NET公开相同的版本号(11.0.0.0),而不管它们来自哪个服务包。
参考文献:
发布于 2015-12-18 15:09:54
因此,如果我将下面的代码添加到应用程序的启动中,它将使用Microsoft.SqlServer.Types程序集的SQL2014版本,该版本似乎没有上述问题。
System.Data.Entity.SqlServer.SqlProviderServices.SqlServerTypesAssemblyName = "Microsoft.SqlServer.Types, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91";
对于安装了SQLServer2014SDK的计算机来说,这很好。
我还在这里向Microsoft提交了一个bug:
https://connect.microsoft.com/SQLServer/Feedback/Details/2139143
https://stackoverflow.com/questions/34204990
复制相似问题