[.NET][筆記] - SshNet.Security.Cryptography - 系統找不到指定的檔案

起因

最近公司要寫一支程式自動上傳檔案到sftp,所以從NuGet下載了「SSH.NET(Renci.SshNet)」這個套件來使用。
結果在測試時一直跳Exception,說系統找不到套件「SshNet.Security.Cryptography」的指定檔案: 這個「SshNet.Security.Cryptography」是SSH.NET套件相依的一個套件。
奇怪的是編譯能夠通過,而且輸出欄位也沒有給出錯誤。

原因

後來查來查去,發現是因為專案使用的.NET Framework版本是4.6.1,

Renci.SshNet套件的.NET版本支援度是:
  • .NET 6.0
  • .NET 7.0
  • .NET Standard 2.0
  • .NET Standard 2.1
  • .NET Framework 4.6.2
SshNet.Security.Cryptography套件的.NET版本支援度是:
  • .NET Standard 1.0
  • .NET Standard 1.3
  • .NET Standard 2.0
  • .NET Framework 2.0
  • .NET Framework 4.0
  • .NET Framework 4.5
所以在專案.NET Framework版本4.6.1的情況下,Visual Studio會自動參考.NET Standard 2.0版本的SSH.NET.NET Framework 4.5版本的SshNet.Security.Cryptography
結果因為兩個套件的目標Framework版本不一樣,所以就掛掉了。

解決方法

解決方法就是從csproj手動更改SshNet.Security.Cryptography套件的目標package版本,改為使用.NET Standard 2.0就可以了。

用Notepad++或Visual Studio Code等等自己用的順手的文字編輯器,打開專案的.csproj檔
找到以下內容:
<Reference Include="SshNet.Security.Cryptography, Version=1.3.0.0, Culture=neutral, processorArchitecture=MSIL">
    <HintPath>..\packages\SshNet.Security.Cryptography.1.3.0\lib\net45\SshNet.Security.Cryptography.dll</HintPath>
</Reference>
<HintPath>中的路徑從net45改為netstandard2.0
<Reference Include="SshNet.Security.Cryptography, Version=1.3.0.0, Culture=neutral, processorArchitecture=MSIL">
    <HintPath>..\packages\SshNet.Security.Cryptography.1.3.0\lib\netstandard2.0\SshNet.Security.Cryptography.dll</HintPath>
</Reference>
之後再重建專案就OK了。

留言

這個網誌中的熱門文章