在 Visual Studio 2019 年作为 "single file" 发布时如何摆脱 SNI.dll?
How do I get rid of SNI.dll when publishing as a "single file" in Visual Studio 2019?
我正在尝试发布一个非常简单的 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 丢失”、“SNI.dll 加载失败”或
的其他变体的文章
我遇到了与您相同的问题并找到了解决方案 here。事实证明,默认情况下,本机库并未捆绑在单个文件可执行文件中。您必须将标志 IncludeNativeLibrariesForSelfExtract
设置为 true
才能获得此行为。
您可能还想检查您的 .deps.json 文件(来自您的构建文件夹)以了解您最初是如何获得此依赖项的。
正如 Simon V. 所说,您可以通过将 IncludeNativeLibrariesForSelfExtract
添加到项目文件并将其设置为 true
.
来解决此问题
tl;博士
Dotnet 的 Windows 运行时取决于 sni.dll.
One day I hope to find out why it's there at all since I can't even find a reference to System.Data anywhere in my entire solution, but you've been a big help. Cheers
-- HumanBean
You might also want to check your .deps.json file (from your build folder) to see how you got this dependency in the first place.
-- Simon V.
给定发布目录路径“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 的所有实例共享以下属性...
- 产品版本:4.6.25512.01 构建者:dlab-DDVSOWINAGE016。提交哈希:d0d5c7b49271cadb6d97de26d8e623e98abdc8db
- 产品名称:Microsoft® .NET Framework
- 修改日期:2017 年 7 月 12 日。
我想知道为什么 .NET 5+ 运行时依赖于似乎是 .NET Framework 的组件。
我正在尝试发布一个非常简单的 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 丢失”、“SNI.dll 加载失败”或
的其他变体的文章我遇到了与您相同的问题并找到了解决方案 here。事实证明,默认情况下,本机库并未捆绑在单个文件可执行文件中。您必须将标志 IncludeNativeLibrariesForSelfExtract
设置为 true
才能获得此行为。
您可能还想检查您的 .deps.json 文件(来自您的构建文件夹)以了解您最初是如何获得此依赖项的。
正如 Simon V. 所说,您可以通过将 IncludeNativeLibrariesForSelfExtract
添加到项目文件并将其设置为 true
.
tl;博士 Dotnet 的 Windows 运行时取决于 sni.dll.
One day I hope to find out why it's there at all since I can't even find a reference to System.Data anywhere in my entire solution, but you've been a big help. Cheers
-- HumanBean
You might also want to check your .deps.json file (from your build folder) to see how you got this dependency in the first place.
-- Simon V.
给定发布目录路径“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 的所有实例共享以下属性...
- 产品版本:4.6.25512.01 构建者:dlab-DDVSOWINAGE016。提交哈希:d0d5c7b49271cadb6d97de26d8e623e98abdc8db
- 产品名称:Microsoft® .NET Framework
- 修改日期:2017 年 7 月 12 日。
我想知道为什么 .NET 5+ 运行时依赖于似乎是 .NET Framework 的组件。