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?
可以从两个方面检查:
- 查看NuGet包的
lib目录,是否包含对应.NET Core的目标框架文件夹(比如netcoreapp3.1、net6.0等); - 查看
.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
相关产品推荐
相关产品推荐

