Issues with 32-bit dll on asp.net website
Issues with 32-bit dll on asp.net website
Having trouble with an asp.net website (running VS2015) which uses a 32-bit dll.
Basically, one part of the website needs to run SqlServerSpatial. This apparently comes from the Microsoft.SqlServer.Types. All has been installed from NuGet before I arrived in the job, and appears referenced correctly.
However, I believe this is a 32-bit dll. Upon trying to perform an operation which requires it, we get this error:
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:reposwebsiteMyCo.GeometrySqlGeometryWriter.cs:line 37
at MyCo.Geometry.SqlGeometryWriter.Write(LineString geometry) in
C:reposwebsiteMyCo.GeometrySqlGeometryWriter.cs:line 11
at MyCo.Web.Modules.harvestplan.HarvestPlanModule.<>c__DisplayClass0_0.<.ctor>b__7(Object _) in
C:reposwebsiteMyCo.WebModulesharvestplanHarvestplanModule.cs:line 164
at Nancy.Routing.DefaultRouteInvoker.Invoke(Route route, DynamicDictionary parameters, NancyContext context)
at Nancy.Routing.DefaultRequestDispatcher.Dispatch(NancyContext context)
InnerException:
Most stuff I've read seems to indicate this is down to using a 32-bit dll, and the freelance dev we use is telling me to change my IIS settings to enable 32-bit mode. Trouble is, when I've gone to this (change platform target in the project build settings), it's currently set to "Any CPU". Changing it to 32-bit gives a System.Exception in mscorlib.dll. Only other IIS I can think of is on my machine - surely any changes I do in that wouldn't be deployed.
Sorry - just getting quite frustrated that something that should be simple is eluding me.
EDIT - well, turns out the previous staff had left a load of nice little surprises for us, lots of different versions of SqlServerSpatial and Microsoft.SqlServer.Types lurking around the code that needed straightening out. Can't really say anything was the answer but there's a few suggestions which may help people in the future, so upvotes for all!
Yep - it is there, checked the solution (has been added to the solution), checked the file exists. According to link it is 32-bit.
– user25730
Aug 22 at 1:40
I suggest you use one of the tools to diagnose DLL binding. You can determine what kind of SqlServerSpatial.DLL is being looked for and whether it's found in a particular directory. If the DLL found was indeed 32-bit but the process is 64-bit then obviously it cannot be loaded. Similarly, if it was 64-bit but the process is 32-bit (WoW64) then it cannot be loaded. You can choose one of the following tools: sxstrace.exe (which can be used for any DLLs), fuslogvw.exe (which can only be used for .NET DLLs, which SqlServerSpatial is), or Process Monitor.
– Hadi Brais
Aug 22 at 2:02
Interesting. Given SxsTrace a go but the outfiles (parsed) are empty. Will have a few more goes soon.
– user25730
Aug 22 at 2:31
1 Answer
1
To run an IIS application in 32bit mode you don't change the platform target in Visual Studio, Any CPU is fine. You need to set the hosting process to be launched as 32bit.
This is done in IIS as a setting on the Application Pool to which the application is mapped. Set the "Enable 32-Bit Applications" setting on the Application Pool, and the apps in that pool will be 32bit.
Good, but not quite. Unless I'm missing something (probably am). Have found the appropriate app pool, set it to 32-bit, stopped it, started it again, and run. Still throwing up the same "unable to load dll SqlServerSpatial.dll" error. Seems to be exactly the same one.
– user25730
Aug 22 at 0:18
By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.
"I believe this is a 32-bit dll" Are you sure? Or perhaps the DLL does not exist at all. Both cases result in the same error. Related: Unable to load SqlServerSpatial.dll.
– Hadi Brais
Aug 22 at 1:33