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

Не удалось загрузить SqlServerSpatial.dll

Я пытаюсь использовать типы SqlServer Spatial CLR в проекте С#.Net. Я хочу использовать SqlGeometry для запроса пространственных записей из моего db.

У меня это работает на моем локальном компьютере в unit test, запущенном в Visual Studio 2010, на удаленной машине SqlServer. Все хорошо.

Затем я публикую службу WCF Rest для моего локального экземпляра IIS, у которого есть служба, которая попадает в ту же библиотеку классов, что и unit test, для выполнения некоторого пространственного запроса, и она терпит неудачу.

Я получаю сообщение об ошибке

Невозможно загрузить DLL SqlServerSpatial.dll: указанный модуль может не найдено.

Я искал это и нашел много, много ответов - никто не работает для меня. У меня есть:

  • зарегистрировал типы CLR с помощью GAC
  • установите 64-разрядную, а затем также 32-разрядную версию VС++
  • попробовал много вариантов использования разных версий dll Microsoft.SqlServer.Types

Единственное, чего я не сделал, и, честно говоря, отказаться от этого, - это установить что-либо в самом окне SqlServer. Мне это кажется ненужным.

В этот момент единственное, что я могу думать, это проблема с правами доступа, поскольку она запущена в пуле приложений IIS, а не внутри Studio, где она работает в unit test.

Обратите внимание, что в моем проекте я НИКОГДА не упоминаю DLL, упомянутую в сообщении об ошибке. Эта dll присутствует в ящике sql, но я не могу добавить ее в студию, поскольку она дает некоторое сообщение, когда я пытаюсь. У меня заканчиваются вещи, чтобы попробовать здесь. Это 90 dll ада снова.

4b9b3361

Ответ 1

У меня была такая же проблема на компьютере с Windows Server 2012. У него был файл SqlServerSpatial110.dll в \Windows\System32, но нет файла SqlServerSpatial.dll. Решением была установка типов системных CLR Microsoft для SQL Server 2008 R2 на компьютере.

  1. http://www.microsoft.com/en-us/download/details.aspx?id=26728
  2. Нажмите Загрузить
  3. Отметьте один из них в зависимости от архитектуры вашего процессора:

    • 1033\x64\SQLSysClrTypes.msi
    • 1033\x86\SQLSysClrTypes.msi
    • 1033\IA64\SQLSysClrTypes.msi
  4. Нажмите Далее

Ответ 2

Моя проблема была похожа на вашу: я установил свой проект ASP.NET MVC на удаленной виртуальной машине Azure и получил следующее исключение:

"Unable to load DLL 'SqlServerSpatial110.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)" 

Чтобы решить проблему, я следовал за этими шагами:

  1. Я добавил ссылку на отсутствующий пакет в моем проекте:

    PM> Install-Package Microsoft.SqlServer.Types
    
  2. Затем я принудительно установил опцию "Копировать в выходной каталог" в "Копировать всегда" для SqlServerSpatial110.dll (вероятно, этот шаг не является строго обязательным...)

  3. Для проектов ASP.NET необходимо добавить следующую строку кода в метод Application_Start в Global.asax.cs:

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

    Этот последний шаг был фундаментальным для меня, потому что без этой строки кода DLL не загружается веб-приложением.

Ответ 3

Я использовал Microsoft.SqlServer.Types.dll в приложениях WPF и ASP.NET для работы с типами и пространственными запросами SqlGeometry в течение многих лет (начиная с версии 10), и вот последние советы, которые я нашел, чтобы успешно загрузить SqlServerSpatialXXX.dll как один из предварительных условий Microsoft.SqlServer.Types.dll.

  • Типы
  • SqlGeometry и SqlGeography могут использоваться в VS-проектах (например, С#), ссылаясь на Microsoft.SqlServer.Types.dll.
  • Microsoft.SqlServer.Types.dll является управляемой библиотекой и имеет некоторую неуправляемую библиотеку в качестве предварительных условий, и они похожи на SqlServerSpatialXXX.dll и msvcrXXX.dll
  • Поскольку Sql Server 2008 доступны разные версии Microsoft.SqlServer.Types.dll, я не вижу никаких изменений функциональности с 2012 года.

Рассмотрите проблемы с 64-битной/32-разрядной версией

  • Для 64-битных махинаций, если вы устанавливаете типы CLR для Sql Server, вы можете найти 64-битные версии этих файлов предварительных условий в Windows/System32, а также вы можете найти 32-разрядные версии файлов предварительных условий в Windows/SysWOW64.
  • Если типы CLR не установлены на компьютере, вы должны вручную загрузить соответствующие версии (32 бит /64 бит) этих предварительных условий на основе вашего проекта (32 бит или 64 бит), иначе будут ошибки, например

Ошибка загрузки SqlServerSpatialXXX.dll

Вы можете проверить проблему 32bit/64bit во время выполнения на С# с помощью Environment.Is64BitProcess. Вот пример кода:

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr LoadLibrary(string libname);

private static void LoadNativeAssembly(string nativeBinaryPath, string assemblyName)
{
    var path = Path.Combine(nativeBinaryPath, assemblyName);

    if (!File.Exists(path))
    {
        throw new FileNotFoundException($"{path} not found");
    }

    var ptr = LoadLibrary(path);
    if (ptr == IntPtr.Zero)
    {
        throw new Exception(string.Format(
            "Error loading {0} (ErrorCode: {1})",
            assemblyName,
            Marshal.GetLastWin32Error()));
    }          
}

public static void LoadNativeAssembliesv13(string rootApplicationPath)
{
    var nativeBinaryPath = Environment.Is64BitProcess
    ? Path.Combine(rootApplicationPath, @"SqlServerTypes\x64\")
    : Path.Combine(rootApplicationPath, @"SqlServerTypes\x86\");

    LoadNativeAssembly(nativeBinaryPath, "msvcr120.dll");
    LoadNativeAssembly(nativeBinaryPath, "SqlServerSpatial130.dll");
}

Рассмотрим двоичный путь в разных типах проектов Рекомендуется указать папку с именем SqlServerTypes в пути выполнения вашего проекта, например

SqlServerTypes > 64

SqlServerTypes > x32

и загрузите неуправляемые сборки, подобные этому

Utilities.LoadNativeAssembliesv13(Environment.CurrentDirectory); //WPF
Utilities.LoadNativeAssembliesv13(HttpRuntime.BinDirectory); //ASP.NET 

Проблемы при использовании ADO.NET для чтения SqlGeometry с сервера Sql Несмотря на то, что вы используете Microsoft.SqlServer.Types.dll, если вы пытаетесь читать их с Sql Server с помощью ADO.NET, вы можете столкнуться с литым исключением потому что SQL Client будет по умолчанию загружать версию 10.0.0.0 Microsoft.SqlServer.Types.dll. В этом случае несколько лет назад я попробовал WKB (подход 1 и 2) и WKT в качестве среды для преобразования между типом SqlGeometry для другой версии Microsoft.SqlServer.Types.dll и нашел, что WKB примерно в 10 раз быстрее, но месяц назад я нашел использование сборки перенаправление, мы можем заставить программу загружать версию, которую мы используем, и используя простой листинг, мы можем получить SqlGeometry (подход 3)

private List<SqlGeometry> SelectGeometries(string connectionString)
{
    SqlConnection connection = new SqlConnection(connectionString);
    var command = new SqlCommand(select shapeCol from MyTable, connection);
    connection.Open();
    List<SqlGeometry> geometries = new List<SqlGeometry>();
    SqlDataReader reader = command.ExecuteReader();
    if (!reader.HasRows)
    {
        return new List<SqlGeometry>();
    }
    while (reader.Read())
    {
        //approach 1: using WKB. 4100-4200 ms for hundred thousands of records
        //geometries.Add(SqlGeometry.STGeomFromWKB(new System.Data.SqlTypes.SqlBytes((byte[])reader[0]), srid).MakeValid());
        //approach 2: using WKB. 3220 ms for hundred thousands of records
        //geometries.Add(SqlGeometry.Deserialize(reader.GetSqlBytes(0))); 
        //approach 3: exception occur if you forget proper assembly redirection. 2565 ms for hundred thousands of records
        geometries.Add((SqlGeometry)reader[0]);
    }
    connection.Close();
    return geometries;
}

Ответ 4

У меня возникли проблемы на машине Windows Server 2008 R2 (Azure VM), но ни один из вышеперечисленных шагов не смог исправить эту проблему. Я установил типы CLR. Я помещаю файлы в папку BIN веб-приложения. Еще ничего. Я, наконец, наткнулся на этот блог у людей в Microsoft, и это сработало. Я оставляю URL-адрес здесь, если он может помочь кому-то еще.

http://blogs.msdn.com/b/adonet/archive/2013/12/09/microsoft-sqlserver-types-nuget-package-spatial-on-azure.aspx

Поскольку вышеупомянутая ссылка больше не работает (спасибо MSFT!), я привел инструкции ниже:

  • Откройте Visual Studio и откройте диспетчер пакетов NuGet.
  • Поиск "Microsoft.SqlServer.Types"
  • Установить...

Этот пакет установит необходимые .DLL в ваше решение/проект. Он также скопирует некоторые дополнительные библиотеки непосредственно в ваш каталог /bin. Вы должны подключить ссылки на эти дополнительные библиотеки в файле global.asax.cs/vb. Инструкции о том, как это сделать, включены в пакет NuGet. Ниже приведена прямая ссылка на пакет NuGet (надеюсь, MSFT тоже не переместит это в забвение).

https://www.nuget.org/packages/Microsoft.SqlServer.Types/

Ответ 5

Несмотря на то, что установлен SQL Server 14.x, VS продолжал настаивать на том, что SqlServerSpatial 110.dll не найден.

При установке типов системных системных CLR для SQL Server 2008 R2 это не удалось исправить. Я также попытался установить версию 10.5 Microsoft.SqlServer.Types, но получил ошибку PInvoke о несоответствии сигнатуры метода.

Поэтому вместо этого я установил Microsoft.SqlServer.Types 14.x, затем переименовал файл SqlServerSpatial 140.dll в SqlServerSpatial 110.dll в папках /x86 и /x64 и сделал то же самое в Loader.cs. По какой-то причине это, похоже, помогло.

Ответ 6

У меня была такая же проблема в Godaddy VPS с сервером windows 2012 r2

I Resolved it by Updating my EF5 to EF6

в консоли диспетчера пакетов запускается до EF5 до EF lalest

Install-Package EntityFramework 

Ответ 7

Извлеките Microsoft.SqlServer.Types.dll из Справочника и используйте Nuget для установки. Перед установкой проверьте версию. В проекте будут установлены сборки для x86 и x64.

Ответ 8

У меня была похожая проблема в проекте ASP.NET MVC 5. Некоторое время назад мне пришлось добавить строку, чтобы указать имя сборки следующим образом:

SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));
SqlProviderServices.SqlServerTypesAssemblyName = Assembly.GetAssembly(typeof(Microsoft.SqlServer.Types.SqlGeography)).FullName;

Я недавно развернул на новый тестовый сервер и снова получил эту ошибку. Он пытался загрузить версию 12 по какой-то причине. Я сейчас указываю точную версию, которую хочу, и она работает как положено.

SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));
SqlProviderServices.SqlServerTypesAssemblyName = "Microsoft.SqlServer.Types, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91";

Надеюсь, это кому-нибудь поможет.

Ответ 9

У меня был старый (2009) проект asp.net webform vb.net, который дал мне эту ошибку на другом сервере. Мне пришлось добавить эту среду выполнения в web.config:

<configuration>
  <runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" />
        <bindingRedirect oldVersion="1.0.0.0-11.0.0.0" newVersion="10.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

http://biandintegration.blogspot.com/2017/12/solved-unable-to-load-dll.html