如何在ASP.NET Core 1.0应用程序中使用SqlServer.Types/空间类型

17

我们的一个类库使用像DbGeography这样的Microsoft空间类型。在没有旧版本的SQL Server和Visual Studio的干净机器上运行应用程序时,我们会收到以下异常:

因为找不到程序集'Microsoft.SqlServer.Types'版本10或更高版本,所以此提供程序不支持空间类型和函数。

解决方案似乎是安装该nuget包:

Install-Package Microsoft.SqlServer.Types
安装完成后,NuGet包会提供如何从每个项目类型中引用DLL的指令:

要将使用空间数据类型的应用程序部署到未安装“SQL Server的System CLR类型”的计算机上,您还需要部署本机程序集SqlServerSpatial110.dll。

该程序集的x86(32位)和x64(64位)版本都已添加到项目的SqlServerTypes \ x86和SqlServerTypes \ x64子目录下。如果未安装C ++运行时,则还包括本机程序集msvcr100.dll。

您需要添加代码以在运行时加载这些程序集中的正确程序集(取决于当前的体系结构)。

ASP.NET 应用程序 对于 ASP.NET 应用程序,请在 Global.asax.cs 的 Application_Start 方法中添加以下代码行: SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));

桌面应用程序 对于桌面应用程序,请在执行任何空间操作之前添加以下代码行: SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);

NuGet包的项目网站无响应,因此我不确定这是否是2016年最佳方法。

我的问题是,我不知道如何从ASP.NET Core 1.0应用程序调用LoadNativeAssemblies。我们正在使用完整框架(net461),而不是核心框架。

public class Startup
{
    public Startup(IHostingEnvironment env)
    {
        ...
        SqlServerTypes.Utilities.LoadNativeAssemblies(env.WebRootPath);
        ...
    }
}

如何在ASP.NET 1.0应用程序中最佳地包含SqlServer.Types dll文件?

相关问题在StackOverflow上这里这里

非常感谢。


你在这方面有什么进展了吗? - Kevin Lee
一点进展都没有。我还在希望能够弄清楚它... - Ender2050
出于好奇,如果不包含那行代码会发生什么呢?在我的.NET Framework项目中,我不需要手动加载程序集,它可以正常工作。由于其他兼容性问题,我还没有成功地在.NET Core上运行它。 - Kevin Lee
这个问题解决了吗?如果没有,除了不使用 .net core 之外,我们还能做些什么呢? - prashant
6个回答

5
今天我在ASP.NET Core应用程序上成功实现了这个(.NET Framework作为底层,与原始帖子相同)。
我注意到的问题是将Nuget包直接添加到我的ASP.NET Core站点中没有多余的文件。不确定这些软件包是否已经更新以与ASP.NET Core一起使用?
无论如何,我只是将该软件包添加到传统的.NET Framework 4.x项目中,并删除了它创建的SqlServerTypes文件夹,然后将该文件夹放在我的ASP.NET Core项目根目录下。将所有4个DLL文件的“复制到输出目录”属性从“不复制”更改为“始终复制”,并添加了对“LoadLibrary()”的调用。
值得注意的是,软件包的14.x版本实际上是SQL vNext而尚未发布,我认为应该将其标记为预发布版。由于我们正在使用SQL 2016,因此我坚持使用13.x。
最初,我将此放在Program.cs文件中,因为它与Middleware、ServiceInjection或Hosting Configuration设置无关。但是,您必须从反射中获取路径才能传递,这感觉很丑陋。因此,我将其放在Startup构造函数的第一行中,因为从那里我可以使用HostingEnvironment路径。
public Startup(IHostingEnvironment env)
{
    SqlServerTypes.Utilities.LoadNativeAssemblies(env.ContentRootPath);

    //The normal config as usual down here...
    var configuration = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
        .AddEnvironmentVariables();
}

我已经尝试过这个方法,甚至可以通过LoadNativeAssemblies进行步骤调试以确保它被调用,但是当实际使用EF中的类型时,仍然会出现错误,指出找不到“Microsoft.SqlServer.Types”版本10或更高版本。你还做了其他事情吗? - Brian Vallelunga
LoadNativeAssemblies 调用之后,您可能还需要添加 SqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;。请参阅 https://dev59.com/U2Ys5IYBdhLWcg3wDft5#40166192。 - Samuel Jack
在我的情况下,我不需要这样做,但我没有使用Entity Framework,尽管我意识到原始问题标记了EF,但帖子实际上从未提到过它。我提到的步骤与数据访问层无关。在EF6或EF Core中是否相关? - Nick Albrecht
1
它实际上并不是程序集的一部分,而是Nuget包在您首次添加它时作为内容项添加到项目中的一个简单方法。查找安装包过程应该已经添加的Loader.cs文件。 - Nick Albrecht
如果您仍然遇到问题,请让我知道。 - Nick Albrecht
显示剩余3条评论

2
我通过在web.config文件中使用bindingRedirect来解决这个问题。
  <dependentAssembly>
    <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-14.0.0.0" newVersion="14.0.0.0" />
  </dependentAssembly>

我正在使用SQL 2016、ASP.NET(非核心版本)和EF 6.0.0.0。


3
这个问题是关于ASP.NET Core的,所以你的回答在任何方面都没有用。 - user247702

0

我解决了它,但这并不是一个干净的解决方案,事实上它一切都不干净:

我不得不在/bin目录下创建一个名为packages的文件夹,并将sql server types包放入其中...而且我必须在每个被asp net core引用的项目中执行此操作,因为它们使用了sql server types,所以这似乎是targets文件中的一个错误或者是不当行为。

请注意,由于/bin目录下的内容不受源代码控制,因此每个团队成员都必须执行此解决方法。

我希望它能有所帮助(同时也已经解决了)

(好吧,现在已经太晚了,明天我会再思考一下问题的原因以及如何解决它,如果我找到更好的解决方法,我会告诉你的,现在它可以按预期构建和运行)


0

使用 .net core 2.0。在安装上述 nuget 包后,我将以下内容放入 Program.cs 中 BuildWebHost(args).Run(); 行之前,然后它就可以工作了。

Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory); SqlProviderServices.SqlServerTypesAssemblyName = "Microsoft.SqlServer.Types, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91";


0

对我来说,bin目录的引用起作用了 :)

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

0

这对我来说似乎有效:

    public class Startup
    {
        public Startup(IHostingEnvironment env)
        {
            ...
            SqlServerTypes.Utilities.LoadNativeAssemblies(env.WebRootPath + @"path to the project that contains the SQLServerTypes folder");
            ...
        }
    }

我注意到 IHostingEnvironment.WebRootPath 返回指向 wwwroot 的路径,但在我的解决方案设置中,该文件夹中有多个项目,因此只是告诉它要指向哪个项目可以帮助我。如果这没有帮助到您,那我很抱歉。

1
同时在调试过程中,这行代码 SqlServerTypes.Utilities.LoadNativeAssemblies(HostingEnvironment.MapPath("~/bin")); 对我很有帮助。 - ArcX

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