Как использовать SqlServer.Types/пространственные типы в приложении ASP.NET Core 1.0
Одна из наших библиотек классов использует пространственные типы Microsoft, такие как DbGeography. При запуске нашего приложения на чистой машине без старых версий SQL Server и Visual Studio мы получаем это исключение:
Пространственные типы и функции для этого провайдера недоступны потому что сборка "Microsoft.SqlServer.Types" версии 10 или выше не удалось найти.
Решение, по-видимому, должно установить этот пакет nuget:
Install-Package Microsoft.SqlServer.Types
После установки пакет nuget дает инструкции о том, как ссылаться на DLL из каждого типа проекта:
Чтобы развернуть приложение, использующее пространственные типы данных, на компьютере, на котором не установлены "Системные CLR-типы для SQL Server", вам также необходимо развернуть собственную сборку SqlServerSpatial110.dll.
Оба x86 (32-разрядных) и x64 (64-разрядных) версии этой сборки были добавлены в ваш проект под подкаталогами SqlServerTypes\x86 и SqlServerTypes\x64. Собственная сборка msvcr100.dll также включена в случае, если среда выполнения С++ не установлена.
Вам нужно добавить код для загрузки правильной одной из этих сборок во время выполнения (в зависимости от текущей архитектуры).
Приложения ASP.NET Для приложений ASP.NET добавьте следующую строку кода в метод Application_Start в Global.asax.cs: SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath( "~/бен" ));
Настольные приложения Для настольных приложений добавьте следующую строку кода для запуска до выполнения любых пространственных операций: SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
Сайт проекта пакета nuget не отвечает, поэтому я не уверен, что это лучший подход к использованию в 2016 году.
Моя проблема в том, что я не могу понять, как вызвать LoadNativeAssemblies из приложения ASP.NET Core 1.0. Мы используем полную структуру (net461), а не базовую структуру.
public class Startup
{
public Startup(IHostingEnvironment env)
{
...
SqlServerTypes.Utilities.LoadNativeAssemblies(env.WebRootPath);
...
}
}
Каков наилучший способ включить файлы dll SqlServer.Types в приложение ASP.NET 1.0?
Связанные вопросы здесь и здесь в StackOverflow.
Большое спасибо.
Ответы
Ответ 1
i исправить это с помощью bindingRedirect в файле 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, используя SQL 2016, ASP.NET(без ядра) и EF 6.0.0.0
Ответ 2
Я получил эту работу над основным приложением ASP.NET сегодня (.NET Framework внизу, а не .NET Core, так же, как и исходный плакат).
То, что я заметил, заключается в том, что добавление пакета Nuget непосредственно на мой основной сайт ASP.NET не дало никаких дополнительных файлов. Не уверены, были ли обновления когда-либо обновлены для работы с ASP.NET Core?
Во всяком случае, я просто добавил пакет к традиционному проекту .NET Framework 4.x и вырвал созданную им папку SqlServerTypes, а затем поместил эту папку в корень моего проекта ASP.NET Core. Изменено свойство Copy to Output Dicrectory
для всех 4 DLL под Do not copy
до Copy Always
и добавлено обращение к LoadLibrary()
.
Стоит отметить, что версия пакета 14.x на самом деле SQL vNext, которая не вышла, она должна была быть отмечена как предварительный релиз на мой взгляд. Я придерживался 13.x, так как мы используем SQL 2016.
Первоначально я поместил это в файл Program.cs, так как он не имел никакого отношения к Middleware, ServiceInjection или настройке конфигурации хостинга. Но тогда вы должны получить Путь, чтобы пройти от отражения, которое казалось уродливым. Поэтому я поставил его как первую строку конструктора 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();
}
Ответ 3
это показалось мне полезным:
public class Startup
{
public Startup(IHostingEnvironment env)
{
...
SqlServerTypes.Utilities.LoadNativeAssemblies(env.WebRootPath + @"path to the project that contains the SQLServerTypes folder");
...
}
}
Я заметил, что IHostingEnvironment.WebRootPath
возвращает путь, указывающий на wwwroot, однако в моей настройке решения у меня есть несколько проектов внутри этой папки, поэтому просто рассказываю, какой проект указывать мне помог. Извините, если это не поможет.
Ответ 4
Я исправил это, это не чистое исправление, действительно, все чистое:
Мне пришлось создать папку в /bin с именами пакетов с пакетом типов sql-сервера... И я должен был сделать это в каждом проекте, на который ссылается ядро asp net, использующее серверные типы sql, поэтому, похоже, это ошибка или misscheheviour в файлах целей.
Обратите внимание, что это обходное решение должно выполняться всеми в вашей команде, поскольку содержимое /bin не будет находиться под контролем источника, как и ожидалось.
Я надеюсь, что это поможет (пока оно исправлено)
(Ну, слишком поздно, завтра я подумаю немного больше о том, что вызвало проблему и как я ее исправил, и если я найду лучшее обходное решение, я дам вам знать, знаю, что он строит и работает как ожидалось )
Ответ 5
Использование .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";