ThinkGeo.com    |     Documentation    |     Premium Support

MrSidRasterLayer -- AccessViolation on Open

MapSuite Team,



I had previously brought this exception to your attention under the following thread:

    thinkgeo.com/forums/MapSuite…fault.aspx



In that thread you had advised that a ‘multi-Raster Layer’ be incorporated to avoid this exception.



In attempting to construct the x/y coordinate index for a MrSid  Multi-RasterLayer this same AccessViolationException is encountered.  A code-snippet that shows how the MrSid is opened and closed is below.



There appears to be no way out of this exception when needing to open multiple MrSid’s.



The last MapSuite Version that I was able to open multiple MrSid’s was V7.  Opening multiple MrSid’s in V8 also did not work and at the time the MapSuite Team advised to continue to use the GeoRasterX86 dll’s from V7 and that this would be fixed in V9.



Is there a fix for this exception?



Appreciate your assistance with this issue.



Dennis






// format Raster Catalog Line for MrSid Raster
private static Boolean BuildRasterCatalogLineMrSid(string TheFile, out string TheRasterCatalogLine)
{
    string sInform;
 
    RectangleShape     TheBoundingBox;
    MrSidRasterLayer   TheRasterLayer;
 
    // initializations
    TheRasterCatalogLine = string.Empty;
 
    TheRasterLayer = new MrSidRasterLayer(TheFile);
 
    try
    {
        TheRasterLayer.Open();
    }
    catch (Exception ex)
    {
        sInform = String.Format(“Unable to Open GeoTiffRasterLayer{0}File={1}{2}Message={3}”, Environment.NewLine, TheFile, Environment.NewLine, ex.Message);
        System.Windows.MessageBox.Show(sInform, “BuildRasterCatalogLineMrSid”, System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error);
        return (false);
    }
 
    TheBoundingBox = TheRasterLayer.GetBoundingBox();
 
    TheRasterLayer.Close();
 
    TheRasterLayer.Dispose();
 
    TheRasterCatalogLine = string.Format("{0},       {1},        {2},       {3},        {4}", TheBoundingBox.UpperLeftPoint.X, TheBoundingBox.LowerRightPoint.X, TheBoundingBox.UpperLeftPoint.Y, TheBoundingBox.LowerRightPoint.Y, TheFile);
 
    return (true);
}





System.AccessViolationException was unhandled

  HResult=-2147467261

  Message=Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

  Source=MapSuiteCore

  StackTrace:

       at xRM=.2EM=.0hs=(String fileName)

       at ThinkGeo.MapSuite.Core.GisImage.8jw=(String filePathName)

       at ThinkGeo.MapSuite.Core.MrSidRasterSource.OpenCore()

       at ThinkGeo.MapSuite.Core.RasterSource.Open()

       at ThinkGeo.MapSuite.Core.RasterLayer.OpenCore()

       at ThinkGeo.MapSuite.Core.Layer.Open()

       at OriStarRaster.MainWindow.BuildRasterCatalogLineMrSid(String TheFile, String& TheRasterCatalogLine) in C:\OriStarMappingInc\OriStarRaster\MainWindow.xaml.cs:line 495

       at OriStarRaster.MainWindow.BuildRasterCatalog(String ThePathOfRasterFiles, String TheDirectoryFileName) in C:\OriStarMappingInc\OriStarRaster\MainWindow.xaml.cs:line 451

       at OriStarRaster.MainWindow.butCreateRasterCatalog_Click(Object sender, RoutedEventArgs e) in C:\OriStarMappingInc\OriStarRaster\MainWindow.xaml.cs:line 398

       at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)

       at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)

       at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)

       at System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)

       at System.Windows.Controls.Primitives.ButtonBase.OnClick()

       at System.Windows.Controls.Button.OnClick()

       at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)

       at System.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e)

       at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)

       at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)

       at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)

       at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)

       at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)

       at System.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e)

       at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)

       at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)

       at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)

       at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)

       at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)

       at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)

       at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)

       at System.Windows.Input.InputManager.ProcessStagingArea()

       at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)

       at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)

       at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)

       at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)

       at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)

       at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)

       at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)

       at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)

       at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)

       at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)

       at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)

       at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)

       at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)

       at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)

       at System.Windows.Threading.Dispatcher.Run()

       at System.Windows.Application.RunDispatcher(Object ignore)

       at System.Windows.Application.RunInternal(Window window)

       at System.Windows.Application.Run(Window window)

       at System.Windows.Application.Run()

       at OriStarRaster.App.Main() in C:\OriStarMappingInc\OriStarRaster\obj\x86\Release\App.g.cs:line 0

       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)

       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)

       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()

       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)

       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)

       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)

       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)

       at System.Threading.ThreadHelper.ThreadStart()

  InnerException: 


Hi Dennis,



Does you mean the issue was never happened in v7 but happened in v8 and v9?



Currently, it is hard to point the exact reason as recreating the issue is not very easy. I looked back on the same issue in our products and most of them are caused by the lack of memory. I am trying to recreate a sample to load multi-mrsid images and refresh them with a timer. Hopefully I will be lucky.



Btw, you may try to change the GCCollectionMode to see if any helps. Map1.GCCollectionMode = GCCollectionMode.Optimized;



I marked it as in progress and I will update here if any updates.

Thanks,



Troy

Troy,



I attempted changing the GcCollectionMode to Optimized, but that still resulted in the exception.



This issue has had a strange history.  This issue existed in V7 and at that time I posted on the form about it.  As a result of that it was fixed and the person who fixed it sent me the MrSidRasterX86.dll, which I installed and it worked fine.  Is it possible that the source code for that fix was never put into your source control and so was lost?  Then once I upgraded to V8 the exception was back.  And like I said I was told to use the version I was given and it worked with V8 so I did not think about it too much.



Prior to your fix for the GeoTiff’s I could only load one MrSid Raster, on loading the second MrSid the exception would be encountered.  Now that I am using V9.0.31.0 I can now load 14 or 15 of the 20 MrSids before encountering the exception.



It does have something to do with memory, but I do not think it is an out-of-memory condition.  The condition is encountered even if I do an Open, followed by a close prior to opening the next one.  So in this case I don’t think memory would be used.



Dennis






Troy,



Just to experiment I took the GeoRasterWrapperX64.dll, that you had given me in July 2014, and moved it to \Windows\SysWow64\Map Suite 9.0\GeoRasterX86 and now all my MrSid’s load.



First of all this doesn’t make sense to me that I move GeoRasterWrapperX64.dll to the GeoRasterX86 Directory and it works.  If I move GeoRasterWrapperX86.dll to the GeoRasterX86 Directory I receive the following exception "External component has thrown an exception"



Just seems to me that something is amiss with these GeoRaster dll’s.  The fact that this old dll works tells me it is not an out-of-memory issue, but rather some type of memory corruption issue within the dll.



Attached are the dll’s that you sent to me last July 2014.



My environment is Windows-7, 64Bit, Visual Studio 2010, Target Framework is .Net V4, Target Platform is AnyCPU.



Regards,

Dennis


001_GeoRasterX64.zip (29.6 KB)
001_GeoRasterX86.zip (19.1 KB)

Hi Dennis,



Thanks you mentioned the correct dlls on July 2014. It helps me a lot to recall. I looked back on the original thread and it was solved by changing the release mode to debug mode when we built the RasterWrapper dll.



We did a little changes on GeoRasterWrapperX64.dll and GeoRasterWrapperX86.dll. Would you please try it and let us know if the question fixed with them? Btw, please also check the GetBoundingBox issue solved several days ago is resolved with the new dlls too.



If the new dlls can fix all of your issue, then we will consider to include the fixes in our products.



Thanks,



Troy

GeoRasterWrapperX64.zip (37.8 KB)
001_GeoRasterWrapperX86.zip (37.7 KB)

Troy,



The new DLL does work as I can open all 20 of my MrSid Rasters simultaneously.



The GetBoundingBox method works for both MrSid and GeoTiff Rasters.



There is one odd issue though which I noted in my previous post…

My development environment is Windows-7, 64Bit, Visual Studio 2010, Target Framework is .Net V4, Target Platform is X86.



My production environment is Windows XP.



Using the GeoRasterWrapperX86.dll in the \Windows\SysWow64\Map Suite 9.0\GeoRasterX86 Directory does not work and causes the following exception:



System.InvalidOperationException was unhandled by user code

  HResult=-2146233079

  Message=C:\OriStar\Chicago\OriStarVisionMapSuite\MapRasters2008\09Maine2008.sid Cannot Be Loaded.

  Source=MapSuiteCore

  StackTrace:

       at ThinkGeo.MapSuite.Core.GisImage.7Tw=(String filePathName)

       at ThinkGeo.MapSuite.Core.MrSidRasterSource.OpenCore()

       at ThinkGeo.MapSuite.Core.RasterSource.Open()

       at ThinkGeo.MapSuite.Core.RasterLayer.OpenCore()

       at ThinkGeo.MapSuite.Core.Layer.Open()

       at OriStarRaster.MultiGeoTiffRasterLayer.DrawCore(GeoCanvas TheCanvas, Collection`1 TheLabelsInAllLayers) in C:\OriStarMappingInc\OriStarRaster\clsMultiLayerTiff.cs:line 250

       at ThinkGeo.MapSuite.Core.Layer.Draw(GeoCanvas canvas, Collection`1 labelsInAllLayers)

  InnerException: 





Using the GeoRasterWrapperX64.dll in the \Windows\SysWow64\Map Suite 9.0\GeoRasterX86 Directory does work.



In order for the above to work the GeoRasterX86 Directory may not contain the GeoRasterWrapperX86.dll.



It would seem to me that the main dll’s are not discerning the proper GeoRasterWrapperX??.dll to use.



Your thoughts?



Regards,

Dennis






Hi Dennis,



So, does it mean the new dlls both x64 and x84 I provided work well in your local machine, and, the new GeoRasterWrapperX86.dll still doesn’t work in your production machine in XP? Could we compare all the related dlls to make sure they are the same between local machine and production machine?



We tested the x86 and x64 wrapper dlls and the map suite core dll can tell which wrapper dlls to choose. Not like your case, when we try to copy the x64 wrapper dll to the x86 folder, it throws exception. I have no idea why the x64 wrapper works fine after replacing the x86 dll in your production machine.



Just let you know one thing we support, the map suite core dll can find the GeoRasterX64 and GeoRasterX86 folder in the bin/release folder, which means those folders is not required in system32/wow64. So It can makes it easier to package one application.



Thanks,



Troy






Troy,



Both my local (Win-7) and production (XP) machines behave the same way and do not work.



This only works when GeoRasterWrapperX64.dll in the GeoRasterX86 directory.



I have further discovered the even moving GeoRasterWrapperX64.dll to the GeoRaster86 directory only works if my application is compiled as a Release.  It does not work compiled in Debug mode.



Are you certain that the GeoRasterWrapperX64.dll is compiled with a target of X64?



Are you certain that the GeoRasterWrapperX86.dll is compiled with a target of X86?



I’ve tried every combination with this so truly believe there is something with the MapSuite dll’s causing this issue.



Thanks,

Dennis


Hi Dennis,


I guess the problem “AccessViolationException ” that
has been resolved now. The exception you have now is “InvalidOperationException ”,
right? 


Would you let me know what the computer settings is? Such as
Culture, format etc. Also would you please package the DLLs you have now and
attached it here? Or would you please check if the attached previous is
ok?  We will try prepare a similar environment
to have another try, I guess there should be something we missed between each
other.


Thanks,


Johnny 



hi Johnny,



Yes, I agree that the exception is now InvalidOperationException, unable to load dll.



My environment is United States, Win-7, 64bit, Visual Studio 2010, WPF, C#.



Attached are the two GeoRasterWrapper dll’s that I have been working with.



I have checked the dll’s and continue to get the exception.



Appreciate your help with this.



Regards,

Dennis


001_001_GeoRasterWrapperX86.zip (37.7 KB)
001_GeoRasterWrapperX64.zip (37.8 KB)

Hi Dennis, 
  
 Thanks for your further information, I guess the problem just occurs when the application is built on x86 platform. I have recreated it on my computer now, the demo code runs into exception when calculating the boundingbox of 17th *.sid file. We have been working on it, any news I will update it here. 
  
 BTW, I guess we made a mistake before that just sending the GeoRasterWrapperX64.dll and GeoRasterWrapperX86.dll to you, actually we should replace all the *.dll under the GeoRasterX64 and GeoRasterX86 folders. 
  
 Thanks, 
 Johnny

Johnny,



Glad to hear you found that specific issue and are working it.



Would just like to remind you that my development environment Win-7, 64bit.



I look forward to a new set of DLL’s.



Thanks for your help.



Dennis


Hi Dennis,



We rebuilt an unmanaged dependencies installer, would you please download it and have another try? To keep all the dlls as expected, we can remove or backup the previous Raster folder on “C:\Windows\SysWOW64\Map Suite 9.0\GeoRasterX64(x86)” and then re-install the dependencies installer. 

ap.thinkgeo.com:5001/fbsharing/rCg2WEaE



Please let us know if the issue persists.



Thanks,



Troy








hi Troy,



I downloaded and installed the msi.  I’ve done testing on my development machine, which is Win-7 64bit, and the issue appears to be solved.  The MrSid’s display just fine.  I will be testing on an XP machine today some time later today.



Thanks very much for all your help with this and everyone else on the MapSuite team!



Regards,

Dennis






Hi Dennis, 
  
 Great to hear we hit it finally. Please let us know once it works also on your target machine. 
  
 Regards, 
  
 Troy

hi Troy,



I’ve tested the changes on both my development (Win-7 64bit) and my target machine (X86) and the new DLL’s work fine on both.



When do you anticipate this will be in a production build?



Thanks again for all your efforts.



Regards,

Dennis


Hi Dennis,



That’s a good news!

For production build, I have to say we’ve stopped the production build for a while as some issues and the version still stop at 9.0.0.23. But the development build is always updated and the current version is 9.0.49.0 now. You may use the development build for a temporary and I believe the production build will be updated soon.



Thanks,



Troy

I am having a similar issue with the AccessViolation Exception caused by trying to render our .sid imagery. We are using the unmanaged dependencies version 9.0.31.0. Is there any way you could attach an updated .msi to this thread?

Hi Joshua,

It seems that this issue is caused by the different version of unmanaged dependencies. We have made some enthancements for unmanaged dependencies since version 9.0.295.0. If any version higher than 9.0.295.0 is referenced in the applicaiton, please download the newest version at here Map Suite Unmanaged Dependencies.

Thanks,

Peter