2024/2/24

Could not load file or assembly 'System.Buffers' 無法載入檔案或組件....

最近遇到C# windows form 的老專案必須使用 smtpclient寄信,但因為MailServer限制使用starttls與587port寄信,使用原來net 的 smtpclient 不能支援此方法,所以必須改用Mailkit組件。

由於原來專案使用.net  Framework 4.5.x版本過舊,咬牙升級為 .net Framework 4.7.1。 Mailkit看似搞定,但在建置過程中卻會看到警訊,

 Could not load file or assembly 'System.Buffers, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

此問題的發生原因是Mailkit需要較新版本的System.Buffers等組件dll,透過nuget更新版本後,專案仍然記載要去拿原來的dll。

解決方法如下

<1>重新註冊元件

透過系統VisualStudio選單底下的開發人員終端機介面(要使用系統管理員權限執行),進到專案packages目錄之下擺放特定組件的位置,重新註冊元件。
教學文內的目錄是 netstandard2.0,傳統.net framework要選.net framework的版本
cd d:/project_folder/packages/System.Buffers.4.5.1/lib/netstandard2.0/
然後執行
gacutil /i System.Buffers.dll
接著回到Visual Studio內的Nuget 套件管理員( package manager console),透過powershell重新安裝套件。
update-package -reinstall
用文字模式打開 csproj 檔案,確認引用組件的版本改為4.0.3.0
(Version=4.0.2.0 to Version=4.0.3.0 )。


<2>進行重新導向組件版本(Binding Redirect)

手動編輯應用程式組態檔(App.Config)。
<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

上述的答案做完之後,因為系統有使用App.Config的關係,在建置完專案後,請記得將有記載對應組件關係的.Config檔案部屬到Production正式環境。筆者為了怕覆蓋正式環境上的組態,自己略過這個檔案,導致一直反覆出現組件不相容錯誤,結果其實是自己犯了低級錯誤而不自知!!!!!

解法的原文在此。
https://stackoverflow.com/questions/63019110/could-not-load-file-or-assembly-system-buffers-version-4-0-2-0