it-roy-ru.com

Невозможно загрузить SqlServerSpatial.dll

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

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

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

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

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

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

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

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

На данный момент единственное, что я могу подумать, это вызвать проблему с разрешениями, потому что она работает в пуле приложений IIS, а не внутри Studio, где она работает в модульном тесте.

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

29
VBAHole

У меня была такая же проблема на компьютере с 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. Нажмите Далее

35
Marcelo Mason

Моя проблема была похожа на вашу: я установил свой проект 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 не загружается веб-приложением.

25
davioooh

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

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

Рассмотрим 64-битные/32-битные проблемы

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

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

Вы можете проверить 32-битную/64-битную проблему во время выполнения в C #, используя 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> x64

SqlServerTypes> x32

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

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

Проблемы при использовании ADO.NET для чтения SqlGeometry с Sql Server Несмотря на то, какую версию Microsoft.SqlServer.Types.dll вы используете, если вы попытаетесь прочитать их с Sql Server с помощью ADO.NET вы можете встретить приведение исключение, потому что клиент SQL по умолчанию загружает версию 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;
}
7
Hossein Narimani Rad

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

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

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

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

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

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

4
Jason

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

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

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

3
Adam

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

I Resolved it by Updating my EF5 to EF6

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

Install-Package EntityFramework 
2
John

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

1
Robson Douglas