.Net Core项目试图有条件地引用32/64位程序集,但dotnet构建始终解析64位



我有一个.net核心库项目和另一个引用该库项目的Asp.net核心项目。

库项目引用了一个具有x64和x86版本的程序集,我希望根据PlatformTarget属性值引用该版本。

我已经看到了这个问题,并且已经使用了他们的解决方案,除了我使用PlatformTarget而不是创建自定义属性之外,这里是项目文件:

<Project Sdk="Microsoft.NET.Sdk">    
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>            
<Configurations>Debug;Release</Configurations>
<Platforms>AnyCPU</Platforms>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>        
<ItemGroup>                  
<Reference Include="STPadLibNet, Version=8.4.3.0, Culture=neutral, PublicKeyToken=a0c5b3c72d40bbc6">
<HintPath>$(PlatformTarget)STPadLibNet.dll</HintPath>
</Reference>          
</ItemGroup>          
</Project>

我试图引用的程序集名为STPadLibNet,64位版本位于Project目录中的x64文件夹中,32位版本位于x86文件夹中。

由于某些原因,即使平台设置为x86,dotnet build也始终解析为x64文件夹,从而在应用程序启动时导致BadImageFormatException。

我读过关于程序集探测的文章,现在我明白了,当程序集解析程序在Project目录或其子目录下找到程序集时,它会忽略HintPath,我尝试为dll使用不同的文件名,如64位版本的STPadLibNetx64.dll和32位版本的ST PadLibNetx86.dll,并引用正确的版本,如下所示:

<HintPath>STPadLibNet$(PlatformTarget).dll</HintPath>

由于某种原因,dll文件被复制到我的库项目输出目录,但没有复制到asp.net核心项目输出目录中,导致启动时出现Assembly not found异常。此外,Rider(我使用的IDE(显示MSBuild未解析程序集。

那么如何告诉dotnet build使用HintPath呢?或者如何根据PlatformTarget引用程序集的正确版本?

注:

  1. 我使用的是.Net core 3.1,我的IDE是Rider 2019.3,操作系统是windows 10 x64 1909,编程语言是C#8
  2. 我引用的程序集是一个硬件SDK,由于明显的原因我无法更改
  3. 我不想创建两个项目,也不想创建一些虚拟项目

最后,我将项目目录外包含STPadLibNet.dll的x86和x64文件夹移到了解决方案目录中,这样HintPath就再次受到尊重。

最新更新