.Net Core 1.1 中的传递引用

Transitive references in .Net Core 1.1

在 .NET Core 1.1 和 Visual Studio 2017 RC 中开发示例 Web 应用程序时,我意识到以下几点:

如您所见:

我在 ClassLibrary3 项目的 class Class3 中写了一个简单的方法,Intellisense 允许我使用 Class1 只写 class 的名称,我的意思是,没有明确引用ClassLibrary1 项目。

我是不是漏掉了什么?我不希望有人只是过来而忽略了 ClassLibrary2。

谢谢。

可传递的项目到项目引用是 Visual Studio 2017 和 Microsoft.NET.Sdk 的新功能。这是故意的行为。

https://github.com/dotnet/sdk/issues/200

如果您对禁用传递引用行为感兴趣,我终于找到了方法。

如果想让项目A引用B,B引用C,但又不想让A引用C,可以在B对C的ProjectReference中添加PrivateAssets="All",如下:

在B.csproj

<ItemGroup>
  <ProjectReference Include="..\C\C.csproj" PrivateAssets="All" />
</ItemGroup>

此设置使 C 的引用私有,因此它仅存在于 B 中。现在引用 B 的项目将不再引用 C。

来源:https://github.com/dotnet/project-system/issues/2313

你有两个选择。

  1. ClassLibrary1.csproj中使用DisableTransitiveProjectReferences属性

    <Project Sdk="Microsoft.NET.Sdk">
        <PropertyGroup>
            <TargetFramework>netcoreapp3.1</TargetFramework>
            <DisableTransitiveProjectReferences>true</DisableTransitiveProjectReferences>
        </PropertyGroup>
        <ItemGroup>
            <ProjectReference Include="..\ClassLibraryCore2\ClassLibraryCore2.csproj" />
        </ItemGroup>
    </Project>
    
  2. ClassLibrary2.csproj中使用PrivateAssets="All"

    <Project Sdk="Microsoft.NET.Sdk">
        <PropertyGroup>
            <TargetFramework>netcoreapp3.1</TargetFramework>
        </PropertyGroup>
        <ItemGroup>
            <ProjectReference Include="..\ClassLibraryCore3\ClassLibraryCore3.csproj" 
                PrivateAssets="All" />
        </ItemGroup>
    </Project>
    

我在其他中解释了更多差异。