推 OppOops: 因為 compiler 大概有幫你 Marshal 做好 05/09 16:02
→ OppOops: c# string 用的是 UTF-16, 對應 c++ 要用 wchar_t 05/09 16:03
→ OppOops: 或是 LPWSTR 05/09 16:04
→ OppOops: 另外 char* 要判斷長度得在字尾加上 '\0' 05/09 16:06
→ OppOops: 是 string[] 的話大概 runtime 也沒幫你加上吧 05/09 16:07
→ OppOops: 或是直接當作是 ansi 來做長度判斷了 05/09 16:07
→ OppOops: 要轉型過去請自己 Marshal 好, 或是一律轉長寬字元 05/09 16:10
感謝你的回答,
關於 func1的問題, 我查了一下字串的預設封送處理
如果沒有寫 MarshalAs. 則默認值為 UnmanagedType.LPStr
其描述為“ANSI 字元之 Null 終端陣列的指標”
我的理解是, 他會把 c# 字串以 ANSI 解讀, 並找到字尾符號,
我的 c++ 端用 char* 接收, 恰好沒問題
不過, func2 也沒寫 MarshalAs
在 c++ 端得到的字串, 我用 memory 去看長這樣
inputStr0 = 中文chine.e
inputStr1 = 嗨12.
其中 . 代表句尾符號
我在想他是不是像 func1 一樣, array 中每個 string 都
被默認當成 ANSI 解讀, 且無遺漏複製給 c++
只是他會多做一件事, 在 c# string 原始長度的下一個位置改成字尾符號
例如, 原本 "中文chinese" 在 c# 長度為 9
可是他用 ANSI 解讀需要長度 11 才能描述
所以 c++ 的 char* 用長度 11 去裝他
但是在 c# string 原始長度 9 的下一個位置 10 會被改成字尾符號
所以 c++ 的 memory 才會看到 "中文chine.e"
不知道是不是這樣解釋?
另外, 確實寫好 MarshalAs 且 c++ 用 wchar 去接, 就沒問題.
※ 編輯: tw30912 (1.163.216.67 臺灣), 05/09/2020 18:20:09
推 OppOops: 大致上沒有錯 基本上我會使用清楚的寫法 05/09 19:02
→ OppOops: 依靠 compiler 預設行為的語法我會盡量避免 05/09 19:02
→ OppOops: Unmanaged / managed code 的轉換很多得靠自己 05/09 19:04
→ OppOops: 不然程式怎麼 crash 都不知道, 會很慘烈.. 05/09 19:05