繁体   English   中英

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

[英]Native ANSI C library from .NET Framework >= 4 on 64 Bit

我有一个C#应用程序,该应用程序(P /)调用制造商提供的ANSI C库,以通过网络访问RFID阅读器。 如果我手动将平台设置为x86,则此功能在.NET Framework 2.0最高为4.5的版本中绝对可以正常工作。

另一方面,将平台设置为64位时,它仅适用于<= 3.5的.NET Framework版本。 我得到的错误代码定义为“ InvalidHandle”,其中句柄是由标识读者的库提供的int值。 我不了解Framework版本对本机库可能产生什么影响,尤其是在64位平台上时。

我观察到的内容,尽管我不确定是否完全相关:-在失败的情况下,句柄为10位数字,有时为正,有时为负-在成功的情况下,句柄为9位数字长期,总是积极的

基于此观察,我尝试了其他数据类型(int,uint,long,ulong),但均未成功(并且行为相同)。

组件的“设置”包含多个步骤(方法调用),这些步骤是:1. Init(从中获取句柄)2. SetChannel(采用字节作为参数)3. SetAddress(采用包含以下内容的连接字符串) IP和端口作为参数)。4. Open()注意:所有这些方法都将句柄作为int输出参数。 因为方法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;
    typedef int BLUEBOX_Handle;

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM