webentwicklung-frage-antwort-db.com.de

So verwenden Sie SqlServer.Types/räumliche Typen in ASP.NET Core 1.0-Anwendung

Eine unserer Klassenbibliotheken verwendet die räumlichen Microsoft-Typen wie DbGeography. Wenn Sie unsere Anwendung auf einem sauberen Computer ohne ältere Versionen von SQL Server und Visual Studio ausführen, wird folgende Ausnahme angezeigt:

Räumliche Typen und Funktionen sind für diesen Anbieter nicht verfügbar weil die Assembly "Microsoft.SqlServer.Types" Version 10 oder höher konnte nicht gefunden werden.

Die Lösung ist offensichtlich, dieses Nuget-Paket zu installieren:

Install-Package Microsoft.SqlServer.Types

Nach der Installation enthält das Nuget-Paket Anweisungen zum Referenzieren der DLLs von jedem Projekttyp:

Zum Bereitstellen einer Anwendung, die räumliche Datentypen verwendet, auf einem Computer, auf dem "System-CLR-Typen für SQL Server" nicht installiert ist, müssen Sie auch die systemeigene Assembly SqlServerSpatial110.dll bereitstellen. 

Die x86-Version (32-Bit) und die x64-Version (64-Bit) dieser Assembly wurden Ihrem Projekt unter den Unterverzeichnissen SqlServerTypes\x86 und SqlServerTypes\x64 hinzugefügt. Die native Assembly msvcr100.dll ist ebenfalls enthalten, falls die C++ - Laufzeit nicht installiert ist.

Sie müssen Code hinzufügen, um die richtige dieser Assemblys zur Laufzeit zu laden (abhängig von der aktuellen Architektur). 

ASP.NET-Anwendungen Fügen Sie für ASP.NET-Anwendungen der Application_Start-Methode in Global.asax.cs die folgende Codezeile hinzu: SqlServerTypes.Utilities.LoadNativeAssemblies (Server.MapPath ("~/bin"));

Desktop-Anwendungen Fügen Sie für Desktopanwendungen die folgende Codezeile hinzu, die ausgeführt werden soll, bevor räumliche Vorgänge ausgeführt werden: SqlServerTypes.Utilities.LoadNativeAssemblies (AppDomain.CurrentDomain.BaseDirectory);

Die Projektseite für das Nuget-Paket reagiert nicht, daher bin ich nicht sicher, ob dies der beste Ansatz ist, der 2016 verwendet werden kann.

Mein Problem ist, dass ich nicht herausfinden kann, wie LoadNativeAssemblies von einer ASP.NET Core 1.0-Anwendung aufgerufen wird. Wir verwenden das vollständige Framework (net461) und nicht das Core-Framework.

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

Was ist der beste Weg, um die SqlServer.Types-DLL-Dateien in einer ASP.NET 1.0-Anwendung einzuschließen?

Verwandte Fragen hier und hier zu StackOverflow.

Danke vielmals.

16
Ender2050

Ich habe das heute an einer ASP.NET Core-Anwendung arbeiten können (.NET Framework darunter, nicht .NET Core, wie das Originalposter).

Ich habe festgestellt, dass das Hinzufügen des Nuget-Pakets direkt zu meiner ASP.NET Core-Site keine zusätzlichen Dateien ergab. Sie sind sich nicht sicher, ob die Pakete jemals aktualisiert wurden, um mit ASP.NET Core zu arbeiten?

Auf jeden Fall habe ich das Paket gerade zu einem traditionellen .NET Framework 4.x-Projekt hinzugefügt und den erstellten SqlServerTypes-Ordner herausgerissen und dann in den Stamm meines ASP.NET Core-Projekts gestellt. Die Copy to Output Dicrectory-Eigenschaft für alle 4 darunter liegenden DLLs wurde von Do not copy in Copy Always geändert und der Aufruf zur LoadLibrary() hinzugefügt.

Es ist erwähnenswert, dass es sich bei der 14.x-Version des Pakets eigentlich um SQL vNext handelt, was nicht out ist. Es sollte in meinen Augen als Vorabversion markiert worden sein. Ich bin bei 13.x geblieben, da wir SQL 2016 verwenden.

Ursprünglich hatte ich dies in die Datei Program.cs geschrieben, da dies nichts mit der Einrichtung von Middleware, ServiceInjection oder Hosting-Konfiguration zu tun hatte. Aber dann muss man den Pfad durch Reflexion hereinlassen, was sich hässlich anfühlte. Also habe ich es stattdessen als erste Zeile des Startup-Konstruktors gesetzt, da ich von dort aus den HostingEnvironment-Pfad verwenden kann.

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();
}
3
Nick Albrecht

ich behebe dies mit einem bindingRedirect in der Datei web.config.

  <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>

ich verwende SQL 2016, ASP.NET (kein Kern) und EF 6.0.0.0

2
emo

Ich habe es behoben, es ist keine saubere Lösung, in der Tat ist es alles andere als sauber:

Ich musste einen in/bin benannten Ordner mit dem SQL Server-Typen-Paket erstellen ... Und ich musste es in jedem Projekt tun, auf das der asp net Kern verwies, der SQL Server-Typen verwendete, also scheint es ein Fehler zu sein ein Missbeheviour in den Zieldateien.

Beachten Sie, dass diese Problemumgehung von jedem Teammitglied vorgenommen werden muss, da/bin-Inhalt nicht wie erwartet unter der Quellcodeverwaltung steht.

Ich hoffe es hilft (mittlerweile ist es behoben)

(Nun, es ist zu spät, morgen werde ich ein bisschen mehr darüber nachdenken, was das Problem verursacht hat und wie ich es behoben habe. Wenn ich einen besseren Workaround finde, lasse ich Sie wissen, dass es baut und wie erwartet ausgeführt wird.)

0
Juan

.Net Core 2.0 verwenden. Nach der Installation des oben erwähnten Nuget-Pakets habe ich dies in Program.cs vor der Zeile mit BuildWebHost (args) .Run (); und es hat funktioniert..

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

0
graemep

das schien für mich zu funktionieren:

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

Ich stelle fest, dass IHostingEnvironment.WebRootPath den Pfad zurückgibt, der auf das wwwroot verweist. In meinem Lösungs-Setup befinden sich jedoch mehrere Projekte in diesem Ordner. Ich sage also einfach, welches Projekt mir helfen soll. Sorry, wenn das nicht hilft.

0
ArchNineTails