Возникли проблемы с веб-сайтом asp.net (под управлением VS2015), который использует 32-разрядную dll.
По сути, одна часть веб-сайта должна запускать SqlServerSpatial. Очевидно, это происходит из Microsoft.SqlServer.Types. Все было установлено из NuGet до того, как я приступил к работе, и, похоже, ссылается правильно.
Однако я считаю, что это 32-битная dll. При попытке выполнить операцию, которая требует этого, мы получаем эту ошибку:
System.DllNotFoundException was unhandled by user code
HResult=-2146233052
Message=Unable to load DLL 'SqlServerSpatial.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
Source=Microsoft.SqlServer.Types
TypeName = ""
StackTrace:
at Microsoft.SqlServer.Types.GLNativeMethods.IsValid(GeoMarshalData g, Boolean& result)
at Microsoft.SqlServer.Types.GLNativeMethods.IsValid(GeoData g)
at Microsoft.SqlServer.Types.SqlGeometry.IsValidExpensive()
at Microsoft.SqlServer.Types.SqlGeometryBuilder.get_ConstructedGeometry()
at MyCo.Geometry.SqlGeometryWriter.Construct(OpenGisGeometryType geomType, LineString geometry) in
C:\repos\website\MyCo.Geometry\SqlGeometryWriter.cs:line 37 at MyCo.Geometry.SqlGeometryWriter.Write(LineString geometry) in
C:\repos\website\MyCo.Geometry\SqlGeometryWriter.cs:line 11 at MyCo.Web.Modules.harvestplan.HarvestPlanModule.<>c__DisplayClass0_0.<.ctor>b__7(Object _) in
C:\repos\website\MyCo.Web\Modules\harvestplan\HarvestplanModule.cs:line 164 at Nancy.Routing.DefaultRouteInvoker.Invoke(Route route, DynamicDictionary parameters, NancyContext context) at Nancy.Routing.DefaultRequestDispatcher.Dispatch(NancyContext context) InnerException:
Большинство вещей, которые я прочитал, похоже, указывают на то, что это связано с использованием 32-битной dll, а разработчик-фрилансер, который мы используем, говорит мне изменить мои настройки IIS, чтобы включить 32-битный режим. Проблема в том, что когда я перешел к этому (изменить целевую платформу в настройках сборки проекта), в настоящее время он установлен на «Любой процессор». Изменение его на 32-разрядное приводит к возникновению исключения System.Exception в mscorlib.dll. На моей машине есть только другие IIS, о которых я могу думать - конечно, любые изменения, которые я делаю в них, не будут развернуты.
Извините, я просто очень разочарован тем, что что-то простое ускользает от меня.
РЕДАКТИРОВАТЬ - ну, оказывается, предыдущий персонал оставил для нас массу приятных сюрпризов, множество различных версий SqlServerSpatial и Microsoft.SqlServer.Types, скрывающихся за кодом, который требовал исправления. Не могу сказать, что что-то было ответом, но есть несколько предложений, которые могут помочь людям в будущем, так что голосуйте за всех!
Ага - он есть, проверил решение (добавлен в решение), проверил, что файл существует. Согласно ссылка на сайт он 32-битный.
Я предлагаю вам использовать один из инструментов для диагностики привязки DLL. Вы можете определить, какой тип SqlServerSpatial.DLL ищется и находится ли он в определенном каталоге. Если найденная DLL действительно 32-битная, но процесс 64-битный, то, очевидно, она не может быть загружена. Точно так же, если он был 64-битным, но процесс 32-битный (WoW64), он не может быть загружен. Вы можете выбрать один из следующих инструментов: sxstrace.exe (который может использоваться для любых библиотек DLL), fuslogvw.exe (который может использоваться только для библиотек DLL .NET, например SqlServerSpatial) или Process Monitor.
Интересный. Дан SxsTrace, но исходящие файлы (проанализированные) пусты. Скоро будет еще несколько.


Чтобы запустить приложение IIS в 32-битном режиме, вы не меняете целевую платформу в Visual Studio, подойдет любой процессор. Вам необходимо настроить запуск хостинга как 32-битный.
Это делается в IIS как параметр в пуле приложений, которому сопоставляется приложение. Установите параметр «Включить 32-разрядные приложения» в пуле приложений, и приложения в этом пуле будут 32-разрядными.
Хорошо, но не совсем. Если я чего-то не упускаю (возможно, я). Нашли соответствующий пул приложений, установили для него 32-разрядную версию, остановили, запустили снова и запустили. По-прежнему выдает ту же ошибку «не удается загрузить dll SqlServerSpatial.dll». Вроде точно такой же.
«Я считаю, что это 32-битная dll» Вы уверены? Или, возможно, DLL вообще не существует. Оба случая приводят к одной и той же ошибке. Связанный: Не удалось загрузить SqlServerSpatial.dll.