Gimp gdk_pixbuf_save fails with AccessViolationException but I don't know why?
===

I'm using code I found to rasterize SVG files into image files. The link is http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_24547525.html. My code looks identical but I'm getting an access violation of:

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

In order to eliminate the obvious: I use an svg file from the Gimp directory so I have a known good file. I use e: as the save to file location so that the library doesn't hit any security/permission stuff. I'm running Visual Studio with Admin privileges in case that is an issue. My box is 64 bit and I have the Local.testsettings set to "Run test in 64 pit process on 64 bit machine."

Any ideas?

My code is:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.ComponentModel;
    
    namespace TA.Rasterizer
    {
        /// <summary>
        /// Takes SVG image file type and converts to PNG image file type. 
        /// Gimp must be installed. Gimp dll location must be in the web.config
        /// file key "ThreatAnalyzer-DllDirectoryForGimp".
        /// <summary>
        /// http://msdn.microsoft.com/en-us/magazine/cc164123.aspx
        /// http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_24547525.html
        /// </summary>    /// </summary>
        public static class Rasterizer
        {
            // C:\Windows\System32
            [DllImport("kernel32.dll", SetLastError = true)]
            static extern bool SetDllDirectory(string pathname);
    
            [DllImport("libgobject-2.0-0.dll", SetLastError = true)]
            static extern void g_type_init();
    
            [DllImport("librsvg-2-2.dll", SetLastError = true)]
            static extern IntPtr rsvg_pixbuf_from_file_at_size(string file_name, int width, int height, out IntPtr error);
    
            [DllImport("libgdk_pixbuf-2.0-0.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)]
            static extern bool gdk_pixbuf_save(IntPtr pixbuf, string filename, string type, out IntPtr error, __arglist);
            //static extern bool gdk_pixbuf_save_to_buffer(
    
            /// <summary>
            /// Get location of Gimp installed Dlls from web.config appsettings key/value.
            /// Key name is found in this.webConfigFileAppSettingsGimp
            /// </summary>
            /// <returns></returns>
            private static string GetGimpDllLocationFromConfigurationFile(bool webapp, string nonDefaultConfigFileName)
            {
                // connect to config file
                Configuration rasterizerConfiguration = new TA.Rasterizer.Configuration(webapp, nonDefaultConfigFileName);
    
                // grab config setting
                return rasterizerConfiguration.Get("ThreatAnalyzer-DllDirectoryForGimp");
            }
    
            /// <summary>
            /// http://msdn.microsoft.com/en-us/magazine/cc164123.aspx
            /// You must check that file exists after call in order to check success. 
            /// </summary>
            /// <param name="inputFileName">SVG file to be converted</param>
            /// <param name="outputFileName">PNG file as final product</param>
            /// <returns></returns>
            public static void SvgToPng(string inputFileName, string outputFileName, bool webapp, string nonDefaultConfigFileName)
            {
                string gimpDllLocation = GetGimpDllLocationFromConfigurationFile(webapp, nonDefaultConfigFileName);
    
                bool rasterizeSuccess = ExternRaster.RasterizeSvg(inputFileName, outputFileName, gimpDllLocation);
    
                if (!rasterizeSuccess)
                {
                    Int32 err = System.Runtime.InteropServices.Marshal.GetLastWin32Error();
                    throw new Win32Exception(err);
                }
            }
        
        /// <summary>
        /// http://msdn.microsoft.com/en-us/magazine/cc164123.aspx
        /// http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_24547525.html
        /// </summary>
        internal sealed class ExternRaster
        {
    
            public static bool RasterizeSvg(string inputFileName, string outputFileName, string gimpDllLocation)
            {
                bool callSuccessful = SetDllDirectory(gimpDllLocation);
                if (!callSuccessful)
                {
                    throw new Exception("Could not set DLL directory");
                }
                g_type_init();
                IntPtr error1;
                IntPtr result = rsvg_pixbuf_from_file_at_size(@"E:\green.svg", -1, -1, out error1);
                if (error1 != IntPtr.Zero)
                {
                    throw new Exception(Marshal.ReadInt32(error1).ToString());
                }
    
                IntPtr error2;
                callSuccessful = gdk_pixbuf_save(result, @"E:\green.jpg", "jpg", out error2, __arglist(null));
                if (!callSuccessful)
                {
                    throw new Exception(error2.ToInt32().ToString());
                }
    
                return true;
            }
    
        }
    
     
    
        }
    }

I'm access the code from an MSTest unit test:

        /// <summary>
        ///A test for RasterizeSvg
        ///</summary>
        [TestMethod()]
        public void RasterizeSvgTest()
        {
            // arrange
            string svgFileNameInAppDirectory = "1kijvsrewxxr3mdvlwitjvyu-pie.svg";

            string currentClassLibDirectory = Environment.CurrentDirectory.Replace(@"\bin\debug\","");
            string pathToAppData = Setup.GetDataPath(); 
            string inputFileName = Path.Combine(pathToAppData, svgFileNameInAppDirectory);
            string outputFileName = Path.Combine(pathToAppData, svgFileNameInAppDirectory.Replace("svg","png"));
            bool webapp = false; 
            string nonDefaultConfigFileName = string.Empty; 

            // act
            Rasterizer.SvgToPng(inputFileName, outputFileName, webapp, nonDefaultConfigFileName);

            // assert
            bool fileExists = File.Exists(outputFileName);
            Assert.IsTrue(fileExists);

            // cleanup
            if (fileExists)
            {
                File.Delete(outputFileName);
            }
        }


  
