关于控制依赖项资产(Controlling dependency assets)的问题

William Liu 511 信誉分
2025-03-10T05:24:41.9966667+00:00

我有A和B两个项目, A项目是WPF的exe项目,B项目是一个library. 它们都是基于最新的.net 9构建.

我希望在B项目中加入Microsoft.AspNetCore.App的引用,以便做一些asp api server相关的配置,并暴露一个方法给WPF项目使用. WPF在显示主窗口后会启动B项目中api server.

上述的基本框架我已经实现了. 现在遇到管理依赖项的一个问题, 希望可以得到你们的帮助.

在B项目的csproj中,我使用了如下的代码来引入对api server相关的支持.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" Version="9.0.2">
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
  </ItemGroup>
</Project>

我不希望asp相关的依赖流入到A项目中,导致WPF项目中会看到asp相关的代码(比如能看到Microsoft.AspNetCore命名空间,以及使用asp里相关的类和工具), WPF项目仅仅需要调用自建的函数来启动B项目中的server即可. 所以我使用了PrivateAssets=all来限制依赖项传入wpf项目. 这样做的结果是,WPF项目的编译通过了,但是在运行WPF时,引发了下面的错误.

System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.AspNetCore, Version=9.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. 系统找不到指定的文件。
File name: 'Microsoft.AspNetCore, Version=9.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'

如果,我在WPF项目中加入下述代码, 则可以让WPF成功启动并运行server. 但是这会导致WPF项目中可以见到asp的相关代码,对后续开发造成干扰.

  <PackageReference Include="Microsoft.AspNetCore.App" Version="9.0.2">
    <PrivateAssets>all</PrivateAssets>
  </PackageReference>

因此, 我阅读了MSDN上的文档来学习如何控制依赖项资产,但是测试了各种IncludeAssets,ExcludeAssets,PrivateAssets的各种组合后,并不能达到我的预期目标:

  1. WPF项目正常运行并启动B项目中的server
  2. WPF项目中无法直接使用asp相关的类和代码.

请帮我指出如何写这两个项目的csproj文件,谢谢!

.NET 运行时
.NET 运行时
.NET: 基于 .NET 软件框架的 Microsoft 技术。运行时: 运行未编译为机器语言的应用所需的环境。
58 个问题
0 个注释 无注释
{count} 票

你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。