ASP.NET核心应用程序中Saxon的Nuget包没有解析引用

时间:2018-05-15 13:05:22

标签: c# asp.net-core nuget saxon

我正在开发一个依赖于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? 你对如何解决这个问题有什么建议吗?

2 个答案:

答案 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 包重新安装后和在任何机器上工作。但是如果您更改包版本,则需要更改此项。