在 Visual Studio 2019 中作為“單個文件”發佈時如何擺脫 SNI.dll?
我正在嘗試發布一個非常簡單的 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”或其他一些變體的文章
我遇到了和你一樣的問題,在這裡找到了解決方案。事實證明,本機庫預設情況下未捆綁在單個文件執行檔中。您必須將標誌設置
IncludeNativeLibrariesForSelfExtract為true才能獲得此行為。您可能還想檢查您的 .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® .NET Framework
- 修改日期:2017 年 7 月 12 日。
我想知道為什麼 .NET 5+ 執行時依賴於 .NET Framework 的一個組件。