溫馨提示×

溫馨提示×

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

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

啟用CLR讓C#調(diào)用C++存在哪些問題

發(fā)布時間:2021-11-24 13:44:29 來源:億速云 閱讀:297 作者:iii 欄目:大數(shù)據(jù)

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

存在的問題

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

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

  2. 參數(shù)傳遞很麻煩,尤其是傳入數(shù)組時,經(jīng)常會出現(xiàn)參數(shù)類型錯誤或者數(shù)組長度不正確,很不靈活。

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

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

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

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

發(fā)現(xiàn)新大陸(公共語言運行時編譯)

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

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

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

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

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

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

指針問題

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

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

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

到此,關(guān)于“啟用CLR讓C#調(diào)用C++存在哪些問題”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

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

AI