2016-08-12 10 views
13

Jedna z naszych bibliotek klas wykorzystuje typy przestrzenne firmy Microsoft, takie jak DbGeography. Uruchamiając naszą aplikację na czystym komputerze bez starszych wersjach SQL Server i Visual Studio, możemy uzyskać ten wyjątek:Jak korzystać z SqlServer.Types/typów przestrzennych w aplikacji ASP.NET Core 1.0

typy przestrzenne i funkcje nie są dostępne dla tego dostawcę ponieważ montażowych Microsoft.SqlServer.Types " wersja 10 lub nowsza nie została znaleziona.

Rozwiązaniem jest najwyraźniej zainstalować ten pakiet Nuget:

Install-Package Microsoft.SqlServer.Types 

Po zainstalowaniu pakietu Nuget daje instrukcje, jak odwołać się do biblioteki DLL z każdego typu projektu:

wdrożyć aplikacja korzystająca z typów danych przestrzennych na komputerze, który nie ma zainstalowanych "Systemowych typów CLR dla SQL Server", należy również wdrożyć natywny zespół SqlServerSpatial110.dll.

Obie wersje x86 (32-bit) i x64 (64-bitowe) tego zespołu zostały dodane do projektu w podkatalogach SqlServerTypes \ x86 i SqlServerTypes \ x64. Macierzysty assembler msvcr100.dll znajduje się również w przypadku, gdy środowisko wykonawcze C++ nie jest zainstalowane.

Musisz dodać kod, aby załadować prawidłowy jeden z tych zespołów w czasie wykonywania (w zależności od aktualnej architektury).

aplikacje ASP.NET przypadku aplikacji ASP.NET, dodaj następującą linię kodu metody Application_Start w Global.asax.cs: SqlServerTypes.Utilities.LoadNativeAssemblies (Server.MapPath ("~/bin")) ;

Aplikacje desktopowe dla aplikacji desktopowych, należy dodać następujący wiersz kodu do uruchomienia zanim jakiekolwiek operacje wykonywane są przestrzenne: SqlServerTypes.Utilities.LoadNativeAssemblies (AppDomain.CurrentDomain.BaseDirectory);

Nuget stronę projektu pakiet nie odpowiada, więc nie jestem pewien, że to jest najlepsze podejście obecnie w użyciu w 2016 roku

mój problem jest, nie mogę dowiedzieć się, jak zadzwonić LoadNativeAssemblies od aplikacja ASP.NET Core 1.0. Korzystamy z pełnej struktury (net461), a nie z podstawowej struktury.

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

Jaki jest najlepszy sposób, aby obejmować SqlServer.Types dll w ramach jednej aplikacji ASP.NET 1.0?

Podobne pytania here i here na StackOverflow.

Wielkie dzięki.

+0

Dostałeś nigdzie z tym –

+0

żadnego postępu w ogóle mam jeszcze nadzieję zrozumieć to ... – Ender2050

+0

Z ciekawości, co się dzieje, kiedy don” t do tej linii? W moim projekcie .NET Framework nie musiałem ręcznie ładować zespołów i działało poprawnie.Nie udało mi się uruchomić go na .NET Core, ale ze względu na inne problemy ze zgodnością. –

Odpowiedz

0

to wydawało się działać dla mnie:

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

Zauważyłem, że IHostingEnvironment.WebRootPath zwraca ścieżkę, która wskazuje na wwwroot jednak w mojej konfiguracji rozwiązanie mam wiele projektów w tym folderze, tak tylko mówię to, który projekt punkt mi pomógł. Przepraszam, jeśli to nie pomoże.

+1

również podczas debugowania to działało dla mnie 'SqlServerTypes.Utilities.LoadNativeAssemblies (HostingEnvironment.MapPath (" ~/bin "));' – Nova

0

Naprawiłem go, nie jest czystą poprawkę, rzeczywiście jest to wszystko, ale czyste:

musiałem utworzyć folder w katalogu/bin wymienionych pakietów z typami serwerów pakietu SQL ... I musiałem zrobić w każdym projekcie, do którego odwołuje się serwer asp net core, który korzystał z typów serwerów sql, więc wydaje się, że jest to błąd lub brak błędów w plikach celów.

Należy pamiętać, że obejście tego problemu będzie musiało zostać wykonane przez wszystkich członków zespołu, ponieważ zawartość/bin nie będzie pod kontrolą źródła, tak jak się tego oczekuje.

Mam nadzieję, że to pomaga (tymczasem jest ona stała)

(dobrze, to zbyt późno, jutro będę myśleć nieco więcej o tym, co jest przyczyną problemu i jak naprawiłem go i jeśli znajdę lepszego obejście Dam wam znać, wiedząc, że buduje i działa zgodnie z oczekiwaniami)

2

Mam to działa na aplikacji ASP.NET Core dziś (. NET Framework pod, a nie .NET Core, tak samo jak oryginalny plakat).

Zauważyłem, że dodanie pakietu Nuget bezpośrednio do mojej witryny ASP.NET Core nie przyniosło dodatkowych plików. Nie wiesz, czy pakiety zostały kiedykolwiek zaktualizowane do pracy z ASP.NET Core?

W każdym razie właśnie dodałem pakiet do tradycyjnego projektu .NET Framework 4.x i wyrzuciłem utworzony przez niego folder SqlServerTypes, a następnie umieszczam go w katalogu głównym mojego projektu ASP.NET Core. Zmieniono właściwość Copy to Output Dicrectory dla wszystkich 4 bibliotek DLL pod numerem Do not copy na Copy Always i dodano wywołanie do LoadLibrary().

Warto zauważyć, że wersja 14.x pakietu jest w rzeczywistości SQL vNext, który nie jest dostępny, powinien być oznaczony jako przedpremierowy w mojej głowie. Utknąłem z 13x, ponieważ używamy SQL 2016.

Pierwotnie umieściłem to w pliku Program.cs, ponieważ nie miało to nic wspólnego z konfiguracją oprogramowania pośredniego, ServiceInjection lub konfiguracji hostingu. Ale wtedy musisz zmusić Ścieżkę, by przeszła od refleksji, która wydawała się brzydka. Tak więc ustawiłem go jako pierwszą linię konstruktora Startup, ponieważ stamtąd mogę użyć ścieżki 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(); 
} 
+0

I ' ve próbował tego i może nawet przejść przez LoadNativeAssembly, aby upewnić się, że zostanie wywołany, ale nadal dostaję błędy, gdy faktycznie używają typów t EF nie stwierdził "Microsoft.SqlServer.Types" w wersji 10 lub wyższej. Czy zrobiłeś coś jeszcze? –

+0

Konieczne może być również dodanie 'SqlProviderServices.SqlServerTypesAssemblyName = typeof (SqlGeography) .Assembly.FullName;' po wywołaniu 'LoadNativeAssemblies'. Zobacz https://stackoverflow.com/a/40166192/1727 –

+0

Nie zrobiłem tego w moim przypadku, ale nie korzystałem z Entity Framework, chociaż zdaję sobie sprawę, że oryginalne pytanie zostało oznaczone tagiem EF, chociaż post nigdy właściwie o tym wspomniałem. Kroki, o których wspomniałem, były agnostyczne dla DAL. Czy jest to istotne w Rdzeniu EF6 lub EF? –

4

Naprawię to za pomocą bindingRedirect w pliku 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> 

im przy SQL 2016 ASP.NET (bez rdzenia) i EF 6.0.0.0

+0

To pytanie dotyczy konkretnie ASP.NET Core, więc twoja odpowiedź nie jest w żaden sposób przydatna. – Stijn

0

Stosując Netto rdzeń 2.0. Po zainstalowaniu powyższego pakietu nuget umieściłem to w Program.cs przed linią z BuildWebHost (args) .Run(); i zadziałało ..

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

Powiązane problemy