4

我正在尝试以编程方式创建.sav文件,而不必使用 SPSS 自动化(SPSS.BackendAPI 库)来释放更多 SPSS 许可证。我在 CodePlex 找到了这个库,它使用 32 位 I/O 模块而无需许可证,这很好。

问题是我需要将应用程序构建为 x64 才能访问我自己的应用程序中的额外可寻址内存。因此,我也需要使用 64 位库。有没有人在托管代码中使用 64 位库运气好?

4

2 回答 2

6

您可以使用 CodePlex 中的该库,但您必须对其进行一些修改才能使用 I/O 模块中包含的 spssio64.dll。在该SpssThinWrapper.cs文件中,您需要更改正在导入的 DLL。您还必须更改一些入口点。要获取 64 位 DLL 中入口点的名称,您需要运行dumpbin /exports spssio64.dll. 如果您这样做,您会看到 64 位和 32 位入口点基本相同,只是一些 32 位入口点后面有一个 @ 符号和一个数字,而 64- 位入口点都没有。位入口点做。请更改所有这些以及 DllImport 属性中的 DLL。例如:

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

变成

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

等等。

完成此操作后,您需要确保使用正确的 DLL。将 spssio64.dll、icudt32.dll、icuin32.dll 和 icuuc32.dll 从 I/O 模块的 win64 文件夹复制到 CodePlex 中 SPSS .NET 库的 Resources 文件夹中。这将覆盖现有的 32 位 dll,因此如果您需要 32 位和 64 位,则必须做一些不同的事情,但听起来您只需要 64 位,所以这应该可以。

.sav作为一个使用这个库创建一个多么容易的例子:

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();
}

该库会为您处理所有的 spss* 调用,并确保它们的顺序正确且一切正常。

于 2011-04-08T18:25:45.283 回答
3

为什么不直接使用 SPSS 社区站点 (www.ibm.com/developerworks/spssdevcentral) 提供的 SPSS Statistics i/o dll?它是免费的,并提供适用于所有受支持的 SPSS 平台的 32 位和 64 位版本。它不需要 SPSS 许可证。

于 2011-04-11T01:51:18.440 回答