.NET Framework中的本机ANSI C库> = 64位上的4

时间:2014-11-14 14:31:31

标签: c# c native ansi

我有一个C#应用程序,它(P /)调用制造商提供的ANSI C库,通过网络访问RFID-Reader。 如果我手动将平台设置为x86,那么.NET Framework 2.0版本最高可以达到4.5。

另一方面,将平台设置为64位,它仅适用于.NET Framework版本< = 3.5。 我得到的错误代码被定义为“InvalidHandle”,其中句柄是一个int我是由识别读者的库给出的。 我没有得到框架版本对本机库有什么影响,特别是如果只是在64位平台上。

我观察到了什么,虽然我不确定它是否相关: - 如果发生故障,手柄长10位,有时为正,有时为负 - 如果成功,手柄长9位,始终为正

基于这种观察,我尝试了其他数据类型(int,uint,long,ulong)但没有成功(并且具有相同的行为)。

组件的“设置”由多个步骤(方法调用)组成,它们是: 1. Init(从中获取句柄) 2. SetChannel(以字节为参数) 3. SetAddress(将包含IP和端口的连接字符串作为参数) 4.打开() 注意:所有这些方法都将句柄作为int out-parameter。 因为方法SetAddress失败了,当Init和SetChannel也将句柄作为参数而不是,我怀疑它可能与字符串有关,虽然我没有找到任何证据来支持这个理论。

不幸的是,文档几乎不存在。

所以任何想法都非常感谢。 如果您需要更多信息,我很乐意提供。

此致

帕斯卡

[DllImport("/x64/BLUEBOXLib.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
static extern int BLUEBOX_Init(out int Handle);

[DllImport("/x64/BLUEBOXLib.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
static extern int BLUEBOX_SetAddress(ref int Handle, byte Address);

[DllImport("/x64/BLUEBOXLib.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
static extern int BLUEBOX_SetChannel(ref int Handle, String Channel, String Settings);

摘自BLUEBOXLib.h文件:

BLUEBOXLib_API BLUEBOX_ErrorCodes __stdcall BLUEBOX_Init (BLUEBOX_Handle *Handle);

BLUEBOXLib_API BLUEBOX_ErrorCodes __stdcall BLUEBOX_SetChannel (BLUEBOX_Handle *Handle, char *Channel, char *Settings);

BLUEBOXLib_API BLUEBOX_ErrorCodes __stdcall BLUEBOX_SetAddress (BLUEBOX_Handle *Handle, unsigned char Address);

typedef int BLUEBOX_Handle;

1 个答案:

答案 0 :(得分:3)

    typedef int BLUEBOX_Handle;

这是一个问题,你无法修复,因为它没有出现在你的代码中。有多种方法可以实现句柄,但它们基本上分为两个不同的类别。它既可以是内部数组的简单索引,也可以是普通指针。当你看到“10位长,有时是正数,有时是负数”时,指针的赔率为99%。

该指针在64位模式下占用8个字节,它不能适合 int 。是的,有时仍然有效,这取决于操作系统和测试程序的简单性。在x64版本的Vista或Win7上,64位指针仍然可以偶然适应32位值,分配通常发生在较低的2 GB地址范围内。你在Win8上获得成功的可能性为零,这也暗示了为什么它似乎适用于.NET 3.5。是的,负值不起作用,因为当C代码将句柄转换为实际指针类型时它们将进行符号扩展,从而产生垃圾指针值。

您无法修复此错误,必须由供应商修复。他们必须将typedef更改为void*,现在您可以在最后使用IntPtr。给他们打个电话。如果它们没有响应,那么考虑在一个单独的32位帮助程序中运行此代码,并与之互操作。