星期二, 6月 24, 2025

[C#] ValueTuple In .NET Framework 4.7

把 C# WinForm repo 從 remote 拉下來合併時,發生某新增的 namespace 存在,但是 VS 說找不到情況,刪除 VS bin 後 rebuild 恢復正常,但執行時卻由 Autofac 產生 Exception,錯誤訊息如下
Could not load file or assembly 'System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' or one of its dependencies. 系統找不到指定的檔案
該 Project 內 ValueTuple 已經是 4.6,但錯誤訊息卻是 4.0.3,發現在 App.Config 內有該段 bindingRedirect
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
      </dependentAssembly>
  </runtime>
  <startup>
</configuration>

把該段刪除後確定可正常執行,從版控中發現這是 202005 .NET Framework 從 4.6 升級為 4.7.2 時被加入,另外從下述討論得知,其實 ValueTuple 在 .NET Framework 4.7 開始就已經內建啦,不需要依賴 nuget 套件
最後判斷是把 App.Config 內的 bindingRedirect 刪除不會影響,順勢把 nuget 下載的 ValueTuple 移除。

進一步追查在 202503 整理 nuget 套件時,有把 ValueTuple 從 4.5 升級為 4.6,不知道是不是該動作造成,要不然 bindingRedirect 從 202005 就存在,不可能這五年時間都相安無事。

沒有留言:

張貼留言