【爬坑】.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. 獲得的經驗:

    1. .net upgrade assistant作為一個升級框架的官方免費工具,還是很好用的。用到visual stiduo的擴充工具下載它,如果發現下載很慢的話,右鍵開啟WLAN網路屬性,把ipv6給關了,會好的多。
    1. 在.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位系統;
    1. 在.net 環境下沒有這個預設選項,在64位的電腦上用AnyCPU表示用anycpu編譯的可執行檔案將在64位CLR上執行。
    1. 手動改為x86就行,如圖:
    1. Visual stiduo 引入的.dll檔案預設在bin檔案下

相關文章