中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

啟用CLR讓C#調用C++存在哪些問題

發布時間:2021-11-24 13:44:29 來源:億速云 閱讀:303 作者:iii 欄目:大數據

這篇文章主要介紹“啟用CLR讓C#調用C++存在哪些問題”,在日常操作中,相信很多人在啟用CLR讓C#調用C++存在哪些問題問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”啟用CLR讓C#調用C++存在哪些問題”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

存在的問題

之前的方式使C#調用C/C++成為可能,但是存在很多缺點,主要表現在以下幾個方面:

  1. 使用extern "C" _declspec(dllexport)的聲明方式只能定義C函數,無法直接使用C++的類,功能不夠強大。

  2. 參數傳遞很麻煩,尤其是傳入數組時,經常會出現參數類型錯誤或者數組長度不正確,很不靈活。

  3. 需要寫重復性的代碼,在C#代碼中需要重復聲明C/C++寫的DLL中的函數,如果在C/C++代碼中定義了結構體,還需要在C#中重復聲明,處理參數類型又是一個麻煩的事情。

  4. 需要手動拷貝DLL到C#程序的目錄下,如果忘記拷貝了,程序在運行時會報DLL未找到的錯誤。

  5. 非常不利于調試,無法在C/C++代碼中進行斷點跟蹤調試。同時對C/C++代碼修改編譯后,需要拷貝DLL到C#程序目錄,否則C#程序調用的還是修改之前的DLL。

前段時間開發的一個應用程序中需要控制兩個數采卡(SP Divece 的ADQ和SDR),官方提供了C和C++的驅動,可以使用C/C++對數采卡進行控制。我最開始還是使用了之前聲明導出函數的方式進行開發,用C語言實現,但是隨著功能的復雜和代碼的增加,上面一系列問題越來越嚴重。

發現新大陸(公共語言運行時編譯)

在奮斗解決各種Bug的時候突然在一次搜索時找到了公共語言運行時編譯。所謂公共語言運行時編譯,就是允許應用程序和組件使用公共語言運行時 (CLR) 中的功能。找到MSDN上的相關文檔:

  1. /clr(公共語言運行時編譯)。

  2. 混合(本機和托管)程序集。

  3. 如何:使用 /clr 編譯 MFC 和 ATL 代碼。

有了公共語言運行時編譯,在C#程序集中就可以引用C++開發的DLL,并且使用C++的類就和使用使用C#類是一樣的,還可以直接斷點調試,以上問題全部解決。

很快,我就把之前用C寫的代碼改寫成了C++的代碼,啟用CLR,并刪掉了C#中重復的代碼。

指針問題

使用C++開發就會經常使用到指針,但C#沒有指針(一般情況,其實C#是有指針的,只不過默認被關閉了)。在C#中要傳遞一個指針至少有兩種方式:

  1. 使用stackalloc在棧上分配內存塊,這類似于C的malloc和C++的new(當然還是有區別的)。

  2. 使用fixed語句固定變量的指針,C#中之所以不讓用指針,就是因為由于垃圾回收機制會導致變量重定位,變量重定位后,之前的指針也就不再指向這個變量了,所以C#在這種情況下是要禁止使用指針。而fixed 語句禁止垃圾回收器重定位可移動的變量,并在執行該語句期間“固定”此變量。固定變量的位置后就可以使用指針了。

到此,關于“啟用CLR讓C#調用C++存在哪些問題”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

汾西县| 福安市| 额济纳旗| 武陟县| 泌阳县| 郧西县| 二连浩特市| 岢岚县| 通海县| 库伦旗| 温泉县| 调兵山市| 务川| 大同县| 江津市| 克拉玛依市| 平湖市| 松滋市| 建阳市| 鄄城县| 潜山县| 睢宁县| 登封市| 大洼县| 枣庄市| 巨鹿县| 库尔勒市| 晋城| 三原县| 长沙县| 昌平区| 阿拉尔市| 剑阁县| 汕头市| 武乡县| 云南省| 邵东县| 景宁| 洪湖市| 潼关县| 兴和县|