【问题标题】:References not being resolved for Saxon's Nuget package in ASP.NET Core Application未解决 ASP.NET Core 应用程序中撒克逊 Nuget 包的引用
【发布时间】:2018-05-15 13:05:21
【问题描述】:

我正在开发一个依赖于 XSLT 2.0 的 .NET Web 应用程序,而来自 Saxonica 的 Saxon-HE NuGet(版本 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' (...) 系统找不到指定的文件。”

\bin 文件夹中实际上缺少必要的 .dll。我查看了位于 \Users\MyUser\.nuget\packages\saxon-he\version-number 的 Saxon-HE nuget 的 .nuspec 文件,它缺少对所有必要库的引用(或依赖项),只有对 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) 中执行相同操作时,Saxon 会按预期工作并找到依赖项。这里的不同之处在于 NuGet 包保存在解决方案文件夹中,我猜引用的解析方式不同。

是我做错了什么,还是一个坏的 NuGet 包? 有没有办法判断 NuGet 包是否支持 .NET Core 项目? 您对如何解决这个问题有什么建议吗?

【问题讨论】:

  • 经过更多研究,我在 Saxon 问题跟踪器上发现,在 2016-08-10 向 Saxon 团队提出了同样的问题; saxonica.plan.io/issues/2873>。原来我说的NuGet package不是Saxonica生产的。他们说他们应该自己发布官方 NuGet 包,但没有迹象表明这实际上会发生。
  • 有关如何检查 NuGet 包是否适用于 .NET Core 的一般性问题,请参阅 docs.microsoft.com/en-us/dotnet/core/porting/third-party-deps。

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


【解决方案1】:

经过更多研究,我在 Saxon 问题跟踪器上发现,在 2016 年 8 月 10 日向 Saxon 团队提出了同样的问题; ;.事实证明,我所指的 NuGet 包不是由 Saxonica 生产的。他们说他们应该自己发布官方 NuGet 包,但没有迹象表明这实际上会发生。

正如 Martin Honnen 所指出的,以下是有关如何判断 NuGet 包是否与 .NET Core 兼容的说明 - https://docs.microsoft.com/en-us/dotnet/core/porting/third-party-deps。

【讨论】:

    【解决方案2】:

    遇到同样的问题。您可以通过编辑 .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 包重新安装后和在任何机器上工作。但是,如果您更改软件包版本,则需要更改此设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-25
      • 1970-01-01
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      • 2010-10-02
      相关资源
      最近更新 更多