You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core中Saxon-HE NuGet包引用无法解析问题求助

问题分析与解决方案

首先明确:你的操作没有错误,这个版本(9.8.0.12)的Saxon-HE NuGet包确实存在适配ASP.NET Core的问题。

为什么会出现这个差异?

传统的ASP.NET Web Application(.NET Framework)和基于.NET Framework的ASP.NET Core项目,对NuGet依赖的解析逻辑不同:

  • 传统ASP.NET项目会自动扫描NuGet包lib目录下的所有相关DLL,并复制到输出目录,即使.nuspec里没明确列出;
  • ASP.NET Core的依赖解析更严格,只会复制.nuspec的<references>节点中明确声明的DLL,这就是为什么你手动修改.nuspec后能解决问题,但这种方法不可持续。

如何判断NuGet包是否支持.NET Core?

可以从两个方面检查:

  1. 查看NuGet包的lib目录,是否包含对应.NET Core的目标框架文件夹(比如netcoreapp3.1、net6.0等);
  2. 查看.nuspec文件中的<dependencies>或<frameworkAssemblies>节点,是否针对.NET Core有对应的依赖声明。
    你使用的9.8.0.12版本的Saxon-HE主要面向传统.NET Framework优化,对ASP.NET Core的支持不完善。

可行的解决方案

方案1:手动在项目中添加缺失的依赖引用(推荐)

不需要修改NuGet包的.nuspec,直接在你的ASP.NET Core项目文件(.csproj)中添加对所有缺失DLL的引用,并设置Private=True(即复制到输出目录):

<ItemGroup>
  <!-- Saxon核心库 -->
  <Reference Include="saxon9he, Version=9.8.0.12, Culture=neutral, PublicKeyToken=e1fdd002d5083fe6">
    <HintPath>..\packages\saxon-he.9.8.0.12\lib\net40\saxon9he.dll</HintPath>
    <Private>True</Private>
  </Reference>
  <!-- IKVM相关依赖 -->
  <Reference Include="IKVM.Runtime, Version=8.1.5717.0, Culture=neutral, PublicKeyToken=13235d27fcbfff58">
    <HintPath>..\packages\saxon-he.9.8.0.12\lib\net40\IKVM.Runtime.dll</HintPath>
    <Private>True</Private>
  </Reference>
  <Reference Include="IKVM.OpenJDK.XML.API, Version=8.1.5717.0, Culture=neutral, PublicKeyToken=13235d27fcbfff58">
    <HintPath>..\packages\saxon-he.9.8.0.12\lib\net40\IKVM.OpenJDK.XML.API.dll</HintPath>
    <Private>True</Private>
  </Reference>
  <Reference Include="IKVM.OpenJDK.Util, Version=8.1.5717.0, Culture=neutral, PublicKeyToken=13235d27fcbfff58">
    <HintPath>..\packages\saxon-he.9.8.0.12\lib\net40\IKVM.OpenJDK.Util.dll</HintPath>
    <Private>True</Private>
  </Reference>
  <Reference Include="IKVM.OpenJDK.Text, Version=8.1.5717.0, Culture=neutral, PublicKeyToken=13235d27fcbfff58">
    <HintPath>..\packages\saxon-he.9.8.0.12\lib\net40\IKVM.OpenJDK.Text.dll</HintPath>
    <Private>True</Private>
  </Reference>
  <Reference Include="IKVM.OpenJDK.Core, Version=8.1.5717.0, Culture=neutral, PublicKeyToken=13235d27fcbfff58">
    <HintPath>..\packages\saxon-he.9.8.0.12\lib\net40\IKVM.OpenJDK.Core.dll</HintPath>
    <Private>True</Private>
  </Reference>
  <Reference Include="IKVM.OpenJDK.Charsets, Version=8.1.5717.0, Culture=neutral, PublicKeyToken=13235d27fcbfff58">
    <HintPath>..\packages\saxon-he.9.8.0.12\lib\net40\IKVM.OpenJDK.Charsets.dll</HintPath>
    <Private>True</Private>
  </Reference>
</ItemGroup>

添加后,每次构建时这些DLL会自动复制到bin目录,团队其他成员只要还原NuGet包就能正常运行,不会受NuGet更新影响。

方案2:升级到Saxon-HE的新版本

Saxon-HE 10及以后的版本对.NET Core的支持有明显改进,修复了NuGet依赖声明的问题。你可以尝试升级到最新版的Saxon-HE NuGet包,新版本会自动处理所有依赖的复制,不需要手动配置。

方案3:用MSBuild任务自动复制依赖

如果不想逐个添加引用,可以在.csproj中添加一个MSBuild目标,在构建完成后自动从NuGet包目录复制所有必要的DLL到输出目录:

<Target Name="CopySaxonDependencies" AfterTargets="Build">
  <ItemGroup>
    <SaxonDlls Include="$(NuGetPackageRoot)saxon-he\9.8.0.12\lib\net40\saxon9he.dll;
                          $(NuGetPackageRoot)saxon-he\9.8.0.12\lib\net40\IKVM.Runtime.dll;
                          $(NuGetPackageRoot)saxon-he\9.8.0.12\lib\net40\IKVM.OpenJDK.XML.API.dll;
                          $(NuGetPackageRoot)saxon-he\9.8.0.12\lib\net40\IKVM.OpenJDK.Util.dll;
                          $(NuGetPackageRoot)saxon-he\9.8.0.12\lib\net40\IKVM.OpenJDK.Text.dll;
                          $(NuGetPackageRoot)saxon-he\9.8.0.12\lib\net40\IKVM.OpenJDK.Core.dll;
                          $(NuGetPackageRoot)saxon-he\9.8.0.12\lib\net40\IKVM.OpenJDK.Charsets.dll" />
  </ItemGroup>
  <Copy SourceFiles="@(SaxonDlls)" DestinationFolder="$(OutputPath)" />
</Target>

这个方法更简洁,适合需要批量复制的场景。

内容的提问来源于stack exchange,提问作者Vilis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:05:23