.Net Core 项目试图有条件地引用 32/64 位程序集,但 dotnet 构建始终解析 64 位
.Net Core project trying to conditionally reference 32/64 bit assembly but dotnet build always resolves 64bit
我有一个 .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 位版本位于项目目录的 x64 文件夹中,32 位版本位于 x86 文件夹中。
出于某种原因 dotnet build
始终解析为 x64 文件夹,即使平台设置为 x86 也会导致应用程序启动时出现 BadImageFormatException。
我读过关于程序集探测的内容,现在我明白当程序集解析器在项目目录或其子目录下找到程序集时它会忽略 HintPath,我尝试为 dll 使用不同的文件名,例如 STPadLibNetx64.dll 64 位版本和 STPadLibNetx86.dll 用于 32 位版本,并像这样引用正确的版本:
<HintPath>STPadLibNet$(PlatformTarget).dll</HintPath>
出于某种原因,dll 文件被复制到我的库项目输出目录,但它没有被复制到 asp.net 核心项目输出目录,导致启动时程序集未找到异常,还有 Rider(IDE I use) 显示程序集未被 MSBuild 解析。
那么如何告诉 dotnet build 使用 HintPath 呢?或者如何根据 PlatformTarget 引用正确版本的程序集?
备注:
- 我正在使用 .Net core 3.1,我的 IDE 是 Rider 2019.3,OS 是 windows 10 x64 1909,编程语言是 C# 8。
- 我引用的程序集是一个硬件 SDK,出于显而易见的原因我不能更改它
- 我不想创建两个项目,我不想创建一些虚拟项目。
在 The End 中,我将包含 STPadLibNet.dll 的 x86 和 x64 文件夹移到项目目录之外的解决方案目录中,这样 HintPath 再次受到尊重。
我有一个 .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 位版本位于项目目录的 x64 文件夹中,32 位版本位于 x86 文件夹中。
出于某种原因 dotnet build
始终解析为 x64 文件夹,即使平台设置为 x86 也会导致应用程序启动时出现 BadImageFormatException。
我读过关于程序集探测的内容,现在我明白当程序集解析器在项目目录或其子目录下找到程序集时它会忽略 HintPath,我尝试为 dll 使用不同的文件名,例如 STPadLibNetx64.dll 64 位版本和 STPadLibNetx86.dll 用于 32 位版本,并像这样引用正确的版本:
<HintPath>STPadLibNet$(PlatformTarget).dll</HintPath>
出于某种原因,dll 文件被复制到我的库项目输出目录,但它没有被复制到 asp.net 核心项目输出目录,导致启动时程序集未找到异常,还有 Rider(IDE I use) 显示程序集未被 MSBuild 解析。
那么如何告诉 dotnet build 使用 HintPath 呢?或者如何根据 PlatformTarget 引用正确版本的程序集?
备注:
- 我正在使用 .Net core 3.1,我的 IDE 是 Rider 2019.3,OS 是 windows 10 x64 1909,编程语言是 C# 8。
- 我引用的程序集是一个硬件 SDK,出于显而易见的原因我不能更改它
- 我不想创建两个项目,我不想创建一些虚拟项目。
在 The End 中,我将包含 STPadLibNet.dll 的 x86 和 x64 文件夹移到项目目录之外的解决方案目录中,这样 HintPath 再次受到尊重。