我正在爲管理OCR設備的DLL編寫包裝。該DLL有其簽名類似於下面的方法:將標準C++字符串編組爲C#字符串的問題
unsigned long aMethod(char **firstParameter, char **secondParameter);
返回amethod方法字符串指針所有參數。
我C#
寫了這個簽名......這幾乎是功能:
[DllImport(aDll.dll, CallingConvention = CallingConvention.Cdecl,
CharSet = CharSet.Auto)]
static unsafe extern ulong aMethod(ref IntPtr firstParameter,
ref IntPtr secondParameter);
我做這樣的調用:
aMethod(ref firstParameter, ref secondParameter);
編組和解組相關的字符串作爲完成這裏:
Marshal.PtrToStringAnsi(firstParameter)
Marshal.PtrToStringAnsi(secondParameter)
很明顯,這個編組是根據D LL的API約定。
現在,編組過程有問題。假設設備有一個帶有這個字符串「abcdefg」的輸入。如果我使用純C++代碼中的DLL,我會得到「abcdefg」作爲輸出。但是,如果我使用的是C#簽名,則字符串會丟失其第一個字符,並且看起來像「bcdefg」。
發生了什麼事?我如何修復C#方法?
我盲目飛行(不必爲我鍵入此編譯器的訪問),但仔細檢查你的C#簽名的返回類型。 你有它作爲'ulong',這是64位。 C方法簽名是'unsigned long'。大小因體系結構而異,但對於Visual C++,「unsigned long」是32位。我不明白這是如何引起你所問的問題的,但還有一件事要檢查並確保你有正確的。 –
完成SwDevMan81!把它寫成答案,我會給你支票! – JPCF
@Juan - 好吧,我將它添加爲答案:) – SwDevMan81