Подтвердить что ты не робот

Как использовать 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.

Большое спасибо.

4b9b3361

Ответ 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";