簡體   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