Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using 64-Bit SPSS Libraries in C#

Tags:

c#

64-bit

spss

I'm trying to create an .sav file programmatically without having to use SPSS automation (the SPSS.BackendAPI library) in order to free up more SPSS licenses. I found this library at CodePlex that uses the 32-bit I/O module without requiring a license, which is good.

The problem is that I need to build the application as x64 in order to gain access to the extra addressable memory in my own application. Thus, I need to use the 64-bit libraries as well. Has anyone had luck using the 64-bit libraries in managed code?

like image 215
Philip Hanson Avatar asked Jan 21 '23 01:01

Philip Hanson


1 Answers

You can use that library from CodePlex, but you'll have to modify it a bit to work with the spssio64.dll that's included with the I/O Module. In the SpssThinWrapper.cs file, you'll need to change the DLL that's being imported. You'll also have to change some of the entry points. To get the names of the entry points in the 64-bit DLL, you'll want to run dumpbin /exports spssio64.dll. If you do this you'll see that the the 64-bit and 32-bit entry points are basically the same, except that some of the 32-bit ones have an @ sign and a number after them, whereas none of the 64-bit entry points do. Do change all of those along with the DLL in the DllImport attribute. For example:

[DllImport("spssio32.dll", EntryPoint="spssCloseAppend@4", CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)]
public static extern ReturnCode spssCloseAppend(int handle);

becomes

[DllImport("spssio64.dll", EntryPoint = "spssCloseAppend", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern ReturnCode spssCloseAppend(int handle);

and so on.

After doing this you'll want to make sure you're using the correct DLLs. Copy the spssio64.dll, icudt32.dll, icuin32.dll, and icuuc32.dll from the win64 folder of the I/O Module into the Resources folder from the SPSS .NET library from CodePlex. This will overwrite the existing 32-bit dlls, so if you need both 32-bit and 64-bit you'll have to do something different, but it sounds like you just need 64-bit, so this should work.

As an example of how easy it is to create an .sav with this library:

using (SpssDataDocument spssDoc = SpssDataDocument.Create("test.sav")) { 
    SpssVariable v = new SpssNumericVariable(); 
    v.Name = "gender"; 
    v.Label = "What is your gender?"; 
    v.ValueLabels.Add(1, "Male"); 
    v.ValueLabels.Add(2, "Female"); 
    doc.Variables.Add(v); 
    doc.CommitDictionary();
    SpssCase c = doc.Cases.New();
    c["gender"] = 1;
    c.Commit();
}

The library handles all of the spss* calls for you, and makes sure they're in the right order and everything.

like image 71
merthsoft Avatar answered Jan 31 '23 06:01

merthsoft