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

问题描述 投票:1回答:1

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

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

我已经看到this问题,并且已经使用了他们的解决方案,只是我使用的是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文件夹。

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

我已经了解了程序集探测,现在我了解到,当程序集解析程序在Project目录或其子目录下找到该程序集时,它会忽略HintPath,我尝试为DLL使用其他文件名,例如STPadLibNetx64.dll作为64位版本, STPadLibNetx86.dll用于32位版本,并引用正确的版本,如下所示:

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

由于某种原因,该dll文件已复制到我的库项目输出目录中,但是没有复制到asp.net核心项目输出目录中,导致在启动时找不到Assembly,Rider(我使用的IDE)也显示了该Assembly MSBuild无法解决。

所以如何告诉dotnet构建使用HintPath?或如何根据PlatformTarget引用正确的程序集版本?

注意:

  1. [我正在使用.Net core 3.1,我的IDE是Rider 2019.3,操作系统是Windows 10 x64 1909,编程语言是C#8。
  2. 我要引用的程序集是一个硬件SDK,出于明显的原因我无法更改它
  3. 我不想创建两个项目,并且我不想创建一些虚拟项目。
c# asp.net-core .net-core .net-assembly platform
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.