關於c#調用c++ dll 的一些問題和解決方案

很多前奏就不說了,爲了利用以前c++可用模塊,給c#調用,需要把c++模塊封裝成dll文件,由於c++和c#屬於有着不同語言規範,會導致封裝好的dll接口的參數類型映射到c#裏面,這裏常用到的主要int ,char * ,const char *(for c++) 一般不要用太高級的東西像標準模板庫stl,或者複雜結構體,這裏主要原因是微軟封裝的這套接口內部有個轉化關係,具體什麼規則,很多人都說的查手冊,我對這個規則也不感興趣,所以沒有深入研究。如果你用,你會發現很多坑,最後都不知道怎麼掉坑裏的。

 c++ 與c# 映射 大部分都可以查一下c#到c++映射, 這裏主要說一下指針的東西,大家都知到c#沒有指針概念,即使不知道也沒關係,這裏說一下字符串的相關指針,char * 如果傳入不改變其值c#對應接口用String,如果修改其傳入值用StringBuilder ,但是在C#需要定製STringBuilder的內存大小,因爲這個東西進入到C++就沒法在動態分配內存了,這個也好理解,本來就不在一個層面的東西,到了底層肯定不好使了,還有給一下StringBuilder的如何分配多大內存的東西,這就是我對c#比較厭惡的一點,用別人東西,都不知道因爲什麼,StringBuilder sb = new StringBuilder(new string('\0',256)) ,這裏256就是相關大小,給個接口也能用成這樣,對於搞c++實在不能忍,我估計很多人都不能忍。

其實說了這麼多最重要的就是倆件事,  

 1.  c++ char* 映射倆種類型 String 和StringBuilder   

 2. StringBuilder 可以傳入c++ 並且可以修改

還有一件事就是返回值中不可以返回StringBuilder 可以返回String 但是返回的String會有些問題,這是本人做rsa加密的時候遇到的,也就是他會把一些空格特殊字符串翻譯成不同的編碼,會導致最後獲取的字符串看起來一樣,其實中間很多地方被修改了。

c#調用c++ dll 由於中間有一層翻譯的東西,也就是虛擬機還是什麼的,會導致一些奇詭的問題,最好在vs一個工程裏面把c#和c++dll庫放在一起調試配置,能快點,要不得累死。其實主要還是對返回的值或者字符串進行編碼,看一下真正的內在東西,你會發現不一樣的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章