在 C# 中使用 64 位 SPSS 库

发布于 2024-10-31 03:16:44 字数 280 浏览 2 评论 0原文

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

问题是我需要将应用程序构建为 x64,以便访问我自己的应用程序中的额外可寻址内存。因此,我还需要使用 64 位库。有人幸运地在托管代码中使用了 64 位库吗?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

忆沫 2024-11-07 03:16:44

您可以使用 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。将 I/O 模块的 win64 文件夹中的 spssio64.dll、icudt32.dll、icuin32.dll 和 icuuc32.dll 从 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* 调用,并确保它们的顺序和一切都正确。

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.

往事随风而去 2024-11-07 03:16:44

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

Why don't you just use the SPSS Statistics i/o dll available via the SPSS Community site (www.ibm.com/developerworks/spssdevcentral)? It is free and comes in 32 and 64 bit versions for all the supported SPSS platforms. It does not require an SPSS license.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文