Dot-Net

在 Visual Studio 2019 中作為“單個文件”發佈時如何擺脫 SNI.dll?

  • January 3, 2022

我正在嘗試發布一個非常簡單的 C# .Net 5.0 WinForms 應用程序(單個文件輸出)作為從 .Net Framework v4.6.1(以前的版本)移植的測試案例,同時使用 Visual Studio 2019 v16.8.2。發布選項如下:

  • 配置:發布 | 任何 CPU
  • 目標框架:net5.0-windows
  • 部署模式:依賴框架
  • 目標執行時:win-x64
  • 生成單個文件:已啟用
  • 啟用 ReadyToRun 編譯:已禁用

儘管建構工作正常並將兩個源程序集合併到一個輸出執行檔中,但它還在輸出目錄中包含 SNI.dll。如果沒有與執行檔位於同一文件夾中的此 DLL,應用程序將無法啟動,所以我的問題是:如何刪除對 SNI.dll 的依賴,使其不包含在已發布的執行檔中並且不需要執行?

該應用程序是一個使用 Crypto-API 生成隨機數據的簡單前端。它不包含任何數據庫功能,這就是為什麼輸出中包含 SNI.dll 讓我如此困惑的原因。據我所知,SNI.dll 與我不使用的 Microsoft.Data.SqlClient 相關

對此的任何幫助將不勝感激。乾杯

PS。我應該提一下,我所有的Google嘗試都發現了關於“SNI.dll Missing”、“SNI.dll failed to load”或其他一些變體的文章

我遇到了和你一樣的問題,在這裡找到了解決方案。事實證明,本機庫預設情況下未捆綁在單個文件執行檔中。您必須將標誌設置IncludeNativeLibrariesForSelfExtracttrue才能獲得此行為。

您可能還想檢查您的 .deps.json 文件(從您的建構文件夾中),看看您是如何獲得這種依賴關係的。

正如 Simon V. 所說,您可以通過添加IncludeNativeLibrariesForSelfExtract到項目文件並將其設置為true.

tl;dr Dotnet 的 Windows 執行時依賴於 sni.dll。

有一天,我希望找出它存在的原因,因為我什至在我的整個解決方案中的任何地方都找不到對 System.Data 的引用,但你幫了大忙。乾杯

人豆

您可能還想檢查您的 .deps.json 文件(從您的建構文件夾中),看看您是如何獲得這種依賴關係的。

-西蒙五世。

給定“bin\Release\net6.0-windows\win-x86\publish”的發布目錄路徑,在父目錄(win-x86,RID)中檢查名為“$(AssemblyName).deps.json”的文件”。

在該文件夾中搜尋依賴項的程序集名稱或文件名。

在我的項目的依賴文件中,“sni.dll”被以下片段引用:

{
 "runtimeTarget": {
   "name": ".NETCoreApp,Version=v6.0/win-x86",
   "signature": ""
 },
 "compilationOptions": {},
 "targets": {
   ".NETCoreApp,Version=v6.0": {},
   ".NETCoreApp,Version=v6.0/win-x86": {
     ...
     "runtime.win-x86.runtime.native.System.Data.SqlClient.sni/4.4.0": {
       "native": {
         "runtimes/win-x86/native/sni.dll": {
           "fileVersion": "4.6.25512.1"
         }
       }
     },
     ...
   }
 }
}

為了進一步調查,我將提供更多資訊。

我電腦上的所有 sni.dll 實例都具有以下屬性…

  • ProductVersion:4.6.25512.01 由:dlab-DDVSOWINAGE016 建構。送出雜湊:d0d5c7b49271cadb6d97de26d8e623e98abdc8db
  • 產品名稱:Microsoft® .NE​​T Framework
  • 修改日期:2017 年 7 月 12 日。

我想知道為什麼 .NET 5+ 執行時依賴於 .NET Framework 的一個組件。

引用自:https://stackoverflow.com/questions/65045224