我有一个.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引用程序集的正确版本?
注:
- 我使用的是.Net core 3.1,我的IDE是Rider 2019.3,操作系统是windows 10 x64 1909,编程语言是C#8
- 我引用的程序集是一个硬件SDK,由于明显的原因我无法更改
- 我不想创建两个项目,也不想创建一些虚拟项目
最后,我将项目目录外包含STPadLibNet.dll的x86和x64文件夹移到了解决方案目录中,这样HintPath就再次受到尊重。