通常,c++ dll庫字元編碼方式都為utf-8,c#呼叫dll時,若遇到中文字元的接收與傳遞,會出現中文字元顯示亂碼與無法傳遞。
按照對應關係,若dll中引數為char,例如char[64] name;則對於的c#字元定義為:
[marshalas(unmanagedtype.byvaltstr, sizeconst = 64)]
public string name;
若name為中文,
由於.net平台多採用unicode字符集,可能為gb2312,utf-16等;若此時對接收到的name,做utf-8到unicode的轉換,仍不能得到正確結果;同樣,對name進行unicode到utf-8的轉換,也不能正確傳遞資料。
原因在於從dll獲取到的char已經隱式轉換成為了string,由於utf-8與unicode漢字編碼位元組數的不一致,導致隱式轉換出錯,之後再進行轉換便不能得到正確結果。
解決方法:
[marshalas(unmanagedtype.byvalarray, sizeconst = 64)]
public byte name;
採用byte接收或封裝接收/傳遞的字元,再進行編碼的轉換。
以下為編碼轉換示例:
public
static
string
getdefaultstring(byte utf8string)
public
static
void
getutf8buffer(string inputstring, int bufferlen, out
byte utf8buffer)
}
C 呼叫C dll 結構體引數傳遞問題
1 最近做專案遇到,c 呼叫c dll裡的函式需要傳遞結構體引數,發現這個並不是簡單的在c 裡定義相應的結構體就可以的,下面以乙個例子來說明解決的辦法,c 中的函式和結構體如下 uint msec set igr gen cfg int port,igr gen t igr gen typedef ...
c 呼叫c dll中的類方法總結
背景 原始 是c form呼叫c 的dll,現因為需要將 搬遷到linux中,需要先將c 的dll轉為c dll,因為c 的form暫時不方便搬遷,需要先轉後的c dll,也就是需要c 呼叫c dll,原來的c 呼叫c dll的呼叫耦合度較高,有對類成員變數和類函式的呼叫,現對呼叫過程進行總結,如果...
C 呼叫C dll中的結構體的定義
為使用者定義的結構指定自定義封送處理 可以為傳遞到非託管函式或從非託管函式返回的結構和類的字段指定自定義封送處理屬性。通過向結構或類的字段中新增 marshalas屬性可以做到這一點。還必須使用 structlayout 屬性設定結構的布局,還可以控制字串成員的預設封送處理,並設定預設封裝大小。示例...