您好,登錄后才能下訂單哦!
這篇文章主要介紹“啟用CLR讓C#調用C++存在哪些問題”,在日常操作中,相信很多人在啟用CLR讓C#調用C++存在哪些問題問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”啟用CLR讓C#調用C++存在哪些問題”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
之前的方式使C#調用C/C++成為可能,但是存在很多缺點,主要表現在以下幾個方面:
使用extern "C" _declspec(dllexport)
的聲明方式只能定義C函數,無法直接使用C++的類,功能不夠強大。
參數傳遞很麻煩,尤其是傳入數組時,經常會出現參數類型錯誤或者數組長度不正確,很不靈活。
需要寫重復性的代碼,在C#代碼中需要重復聲明C/C++寫的DLL中的函數,如果在C/C++代碼中定義了結構體,還需要在C#中重復聲明,處理參數類型又是一個麻煩的事情。
需要手動拷貝DLL到C#程序的目錄下,如果忘記拷貝了,程序在運行時會報DLL未找到的錯誤。
非常不利于調試,無法在C/C++代碼中進行斷點跟蹤調試。同時對C/C++代碼修改編譯后,需要拷貝DLL到C#程序目錄,否則C#程序調用的還是修改之前的DLL。
前段時間開發的一個應用程序中需要控制兩個數采卡(SP Divece 的ADQ和SDR),官方提供了C和C++的驅動,可以使用C/C++對數采卡進行控制。我最開始還是使用了之前聲明導出函數的方式進行開發,用C語言實現,但是隨著功能的復雜和代碼的增加,上面一系列問題越來越嚴重。
在奮斗解決各種Bug的時候突然在一次搜索時找到了公共語言運行時編譯。所謂公共語言運行時編譯,就是允許應用程序和組件使用公共語言運行時 (CLR) 中的功能。找到MSDN上的相關文檔:
/clr(公共語言運行時編譯)。
混合(本機和托管)程序集。
如何:使用 /clr 編譯 MFC 和 ATL 代碼。
有了公共語言運行時編譯,在C#程序集中就可以引用C++開發的DLL,并且使用C++的類就和使用使用C#類是一樣的,還可以直接斷點調試,以上問題全部解決。
很快,我就把之前用C寫的代碼改寫成了C++的代碼,啟用CLR,并刪掉了C#中重復的代碼。
使用C++開發就會經常使用到指針,但C#沒有指針(一般情況,其實C#是有指針的,只不過默認被關閉了)。在C#中要傳遞一個指針至少有兩種方式:
使用stackalloc
在棧上分配內存塊,這類似于C的malloc
和C++的new
(當然還是有區別的)。
使用fixed語句
固定變量的指針,C#中之所以不讓用指針,就是因為由于垃圾回收機制會導致變量重定位,變量重定位后,之前的指針也就不再指向這個變量了,所以C#在這種情況下是要禁止使用指針。而fixed 語句
禁止垃圾回收器重定位可移動的變量,并在執行該語句期間“固定”此變量。固定變量的位置后就可以使用指針了。
到此,關于“啟用CLR讓C#調用C++存在哪些問題”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。