.net core 为什么不是';t System.Data.SqlClient是否由dotnet publish发布?

.net core 为什么不是';t System.Data.SqlClient是否由dotnet publish发布?,.net-core,.net Core,我有一个类似这样的something.csproj项目: <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp1.0</TargetFramework> </PropertyGroup> <ItemGroup>

我有一个类似这样的something.csproj项目:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp1.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="System.Data.SqlClient" Version="4.1.0" />
  </ItemGroup>

</Project>
using System;
using System.IO;
using System.Data.SqlClient;

namespace SomethingNS
{
    public class Something
    {
       public static void Main()
       {
           var a = new SqlCommand();
       }
    }
}
使用dotnet 2.0,我执行:

dotnet publish
但是我在文件夹
\bin\Debug\netcoreapp1.0\publish\System.Data.SqlClient.dll
中没有看到
System.Data.SqlClient.dll


为什么呢

原因是
System.Data.SqlClient
的.NET核心实现在windows和unix上不同,因此利用了.NET核心加载所需特定库的能力

您发布了一个“可移植”应用程序,该应用程序能够在windows、linux、macOS等平台上运行,相应的库将从
runtimes/unix/lib/netstandard1.3/System.Data.SqlClient.dll
runtimes/win/lib/netstandard1.3/System.Data.SqlClient.dll
加载。还有一些其他特定于平台的资产(用于unix的托管
System.IO.Pipes.dll
,以及用于32位和64位windows的两个本机
sni.dll
文件)


这就是发布输出的根级别中没有
System.Data.SqlClient.dll
的原因。
bin\Debug\netcoreapp1.0\publish\runtimes
子文件夹中应该有变体。

原因是
System.Data.SqlClient
的.NET核心实现在windows和unix上不同,因此利用.NET核心的能力来加载所需的特定库

您发布了一个“可移植”应用程序,该应用程序能够在windows、linux、macOS等平台上运行,相应的库将从
runtimes/unix/lib/netstandard1.3/System.Data.SqlClient.dll
runtimes/win/lib/netstandard1.3/System.Data.SqlClient.dll
加载。还有一些其他特定于平台的资产(用于unix的托管
System.IO.Pipes.dll
,以及用于32位和64位windows的两个本机
sni.dll
文件)


这就是发布输出的根级别中没有
System.Data.SqlClient.dll
的原因。
bin\Debug\netcoreapp1.0\publish\runtimes
子文件夹中应该有变体。

如果我使用
Version=“4.4.0”
而不是
Version=“4.1.0”
,它确实会显示在那里,但请检查GAC以查看是否安装了4.1.0。我在
C:\Windows\assembly
中没有看到该dll的任何版本。(这就是我在GAC中查看的地方,对吗?)但是我确实在
%userprofile%\.nuget\packages\system.data.sqlclient
Welp中看到了不同的版本,如果您搜索了整个GAC,但没有找到它的安装,那么我的AG有点太W了。祝您好运。@NET核心应用程序会不会使用GAC。如果我使用
Version=“4.4.0”
而不是
Version=“4.1.0”
,它确实会显示在WAG中,但请检查GAC以查看是否安装了4.1.0。我在
C:\Windows\assembly
中没有看到该dll的任何版本。(这就是我在GAC中查找的地方,对吗?)但是我确实在
%userprofile%\.nuget\packages\system.data.sqlclient
Welp中看到了不同的版本,如果你搜索了整个GAC,但没有找到它的安装,那么我的AG有点太W了。祝你好运。@Will.NET核心应用程序不使用GAC。谢谢Marin,我现在理解得很好,Martin解释道,谢谢我今天很挣扎。我很困惑为什么我的部署包这么大,结果是因为runtimes文件夹。在进行dotnet发布时,我尝试设置--runtime win-x64参数,希望它不包括其他运行时的libs,但最终创建了一个超过90MB的发布目录!经过研究,提供运行时似乎会将其转化为SCD,从而形成已发布应用程序的大小。有没有办法指定运行时,使其不是SCD,并且不包含所有的运行时?@Tophat,要发布一个不是SCD且不包含所有运行时的dotnet核心,请查看我在本文中使用的参数:谢谢Marin,我现在明白了Martin,谢谢!我今天很挣扎。我很困惑为什么我的部署包这么大,结果是因为runtimes文件夹。在进行dotnet发布时,我尝试设置--runtime win-x64参数,希望它不包括其他运行时的libs,但最终创建了一个超过90MB的发布目录!经过研究,提供运行时似乎会将其转化为SCD,从而形成已发布应用程序的大小。有没有办法指定运行时,使其不是SCD,并且不包含所有运行时?@Tophat,要发布不是SCD且不包含所有运行时的dotnet core,请参阅我在本文中使用的参数: