我正在开发一个依赖于XSLT 2.0的.NET Web应用程序,然后从Saxon-HE NuGet开始Saxonica(版本9.8.0.12 - 写这篇文章的最新版本)用于转换因为.NET目前仅支持XSLT 1.0(.NET Framework 4.7.1)。
使用ASP.NET Core Application
定位.NET Framework
并尝试实例化Saxon.Api.Processor
时,我得到一个运行时System.IO.FileNotFoundException
说:
“无法加载文件或程序集'saxon9he'(...)系统找不到指定的文件。”
.dll
文件夹中实际上缺少必要的\bin
。我查看了.nuspec
文件中的Saxon-HE nuget,它位于\Users\MyUser\.nuget\packages\saxon-he\version-number
,并且缺少对所有必需库的引用(或依赖项),只存在对saxon9he-api.dll
的引用。
<references>
<reference file="saxon9he-api.dll" />
</references>
在调查nuget的\lib
文件夹时,我发现NuGet包需要saxon9he.dll和IKVM dll。所以我编辑了.nuspec
文件并在那里添加了缺少的引用。
<references>
<reference file="saxon9he-api.dll" />
<reference file="saxon9he.dll" />
<reference file="IKVM.Runtime.dll" />
<reference file="IKVM.OpenJDK.XML.API.dll" />
<reference file="IKVM.OpenJDK.Util.dll" />
<reference file="IKVM.OpenJDK.Text.dll" />
<reference file="IKVM.OpenJDK.Core.dll" />
<reference file="IKVM.OpenJDK.Charsets.dll" />
</references>
现在Saxon的处理器实例化没有错误。问题是这不是好事,因为NuGet更新会制动它并且它不会在其他没有编辑.nuspec
文件的机器上工作(并且不应该首先完成)。
然而,当在ASP.NET Web Application (.NET Framework)
中做同样的事情时,撒克逊按预期工作并找到依赖关系。这里的区别在于NuGet包保存在解决方案文件夹中,我猜测引用的解析方式不同。
我做错了什么或者是不好的NuGet pakage? 有没有办法判断NuGet包是否支持.NET Core Projects? 你对如何解决这个问题有什么建议吗?
答案 0 :(得分:0)
经过更多的研究,我发现撒克逊问题跟踪器已经在2016-08-10向撒克逊队提出了同样的问题; ;。事实证明,我所指的NuGet包不是由Saxonica制作的。他们说他们应该自己发布官方的NuGet包,但没有迹象表明这实际上会发生。
正如 Martin Honnen 所指出的,这里有关于如何判断NuGet包是否与.NET Core兼容的说明 - https://docs.microsoft.com/en-us/dotnet/core/porting/third-party-deps。
答案 1 :(得分:0)
遇到同样的问题。您可以通过编辑 .csproj 文件手动添加必要的 dll:
<ItemGroup>
<Reference Include="IKVM.OpenJDK.Charsets">
<HintPath>..\..\..\packages\saxon-he\9.5.0.2\lib\net35\IKVM.OpenJDK.Charsets.dll</HintPath>
</Reference>
<Reference Include="IKVM.OpenJDK.Core">
<HintPath>..\..\..\packages\saxon-he\9.5.0.2\lib\net35\IKVM.OpenJDK.Core.dll</HintPath>
</Reference>
<Reference Include="IKVM.OpenJDK.Text">
<HintPath>..\..\..\packages\saxon-he\9.5.0.2\lib\net35\IKVM.OpenJDK.Text.dll</HintPath>
</Reference>
<Reference Include="IKVM.OpenJDK.Util">
<HintPath>..\..\..\packages\saxon-he\9.5.0.2\lib\net35\IKVM.OpenJDK.Util.dll</HintPath>
</Reference>
<Reference Include="IKVM.OpenJDK.XML.API">
<HintPath>..\..\..\packages\saxon-he\9.5.0.2\lib\net35\IKVM.OpenJDK.XML.API.dll</HintPath>
</Reference>
<Reference Include="IKVM.Runtime">
<HintPath>..\..\..\packages\saxon-he\9.5.0.2\lib\net35\IKVM.Runtime.dll</HintPath>
</Reference>
<Reference Include="saxon9he">
<HintPath>..\..\..\packages\saxon-he\9.5.0.2\lib\net35\saxon9he.dll</HintPath>
</Reference>
</ItemGroup>
这样它就可以在 NuGet 包重新安装后和在任何机器上工作。但是如果您更改包版本,则需要更改此项。