【爬坑】.Net編譯環境導致的問題 不愿透露姓名的小村村 發表於2024-09-06
1. 背景:
專案中遇到一個串列埠裝置,透過呼叫它自帶的.dll
動態連結庫通訊,最開始在.net framework4.7.2的框架下裝置能返回資料(正常通訊)。但是換到.net 6.0的框架後,可以執行(沒有報錯),但是不能得到裝置返回的資料了。
2. 錯誤的解決思路:
當時覺得是框架的問題,反編譯可以看到該.dll的反射,但是沒有原始碼不能修改。
如果嘗試用.net upgrade assistant
強行升級框架,該.dll檔案只會出現提示Cannot add reference "xxx.dll" to project "xxx" because their target framework are incompatible
,沒有任何實際作用。
3. 正確的解決思路:
不管是.net framework 4.7.2 還是 .net 6.0,當時都是預設的Any CPU
,這個環境造成了這個問題。
該串列埠裝置在執行的時候環境是基於x86的,所以在.net 6.0的框架下,把CPU型別選成x86就行了。
4. 獲得的經驗:
.net upgrade assistant
作為一個升級框架的官方免費工具,還是很好用的。用到visual stiduo的擴充工具下載它,如果發現下載很慢的話,右鍵開啟WLAN網路屬性,把ipv6
給關了,會好的多。
在.net framework下使用AnyCPU能正常的原因如下圖,.net framework 4.5以上預設首選32位
:
在32位系統下,執行32位程式
在64位系統下,執行32位程式,但是可以獲得4G記憶體
在ARM下,執行32位程式
那麼AnyCPU(Prefer 32-bit) 和x86有什麼區別?實際上在ARM系統,只能使用 AnyCPU(Prefer 32-bit) 執行32位程式,如果選擇x86就無法執行。
為什麼需要在64位的裝置使用 AnyCPU(Prefer 32-bit),因為如果存在一些庫只能在32位程式執行,那麼就需要執行的程式是32位,所以需要使用這個方法。
ARM32/ARM64是ARM CPU下的32位或者64位系統;
在.net 環境下沒有這個預設選項,在64位的電腦上用AnyCPU表示用anycpu編譯的可執行檔案將在64位CLR上執行。
手動改為x86就行,如圖:
Visual stiduo 引入的.dll檔案預設在bin
檔案下