我有一个.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引用正确的程序集版本?
注意:
最后,我将包含STPadLibNet.dll的x86和x64文件夹从Project Directory移到了解决方案目录,这样就再次尊重了HintPath。