AspNetCore、project.fragment.lock.json 和多个配置的平台

AspNetCore, project.fragment.lock.json, and multiple configured platforms

我有一个 AspNetCore 项目引用了另一个项目,它同时为 AnyCpu 和 x64 平台构建,我需要支持这两个平台(我有需要 AnyCpu 的遗留项目,但 AspNetCore 只支持 x64 平台) .

所以我需要在构建我的 AspNetCore 项目时使用 x64 平台。问题是我的引用项目的 AnyCpu 配置具有 OutputDirectory bin\debug,而对于我的 x64 配置,OutputDirectory 是 bin\x64\debug。问题是在生成的 project.fragment.lock.json 文件内部(我什至不确定它是 Visual Studio 还是其他生成 project.fragment.lock.json 的文件),我总是看到引用的 dll通过路径 bin\debug,而不是 bin\debug\x64。

我通过使引用项目的输出目录与平台无关来解决这个问题,但这是一个糟糕的解决方案,因为它经常由于使用为错误平台构建的 dll 而导致错误(并且许多其他问题)。还有其他人发现了吗?

我已经尝试了很多破解方法,包括修改 AspNetCore 项目的 xproj 以尝试注入平台,修改引用项目的 csproj 文件,设置默认平台,但我'我仍在尝试,如果我找到答案,希望能添加一个答案。

以下是我整理出来的内容,以及我解决的问题的解决方法。

最初我认为在构建 AspNetCore 项目时,由于该项目中没有 $(Platform) 值的迹象,因此 Visual Studio 正在构建这些项目而没有设置 $(Platform),但是那是不正确的。事实上,对于 AspNetCore 项目(或任何使用 xproj 文件的项目),$(Platform) 被显式设置为 AnyCPU,据我所知,不可能更改它。如果您尝试在 Configuration Manager 中将 DotNetCore 项目的平台设置为 x64,它不会显示任何错误,但不会有任何效果;下次打开配置管理器时,它会显示为设置回 AnyCPU。

因此,假设我无法控制 $(Platform) 的设置,并且它被固定到 AnyCPU,但我要求 PlatformTarget 设置为 x64,并且我需要一个不同的 OutputPath对于 x64 与 AnyCPU,我别无选择,只能开始使用 $(Configuration) 来控制它。

这就是解决方法:在解决方案中创建 DebugDotNetCore 配置和 ReleaseDotNetCore 配置,并在 AspNetCore 项目使用的任何项目中,创建如下所示的 PropertyGroups:

<PropertyGroup Condition="'$(Configuration)' == 'DebugDotNetCore'">
  <DebugSymbols>true</DebugSymbols>
  <OutputPath>bin\DebugDotNetCore\</OutputPath>
  <DefineConstants>DEBUG;TRACE</DefineConstants>
  <DebugType>full</DebugType>
  <PlatformTarget>x64</PlatformTarget>
  <ErrorReport>prompt</ErrorReport>
    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>

然后,在配置管理器中,使 DebugDotNetCore 配置在您添加它的每个项目中使用 DebugDotNetCore。并且还为 AspNetCore 项目添加配置,并将其用于那些项目(否则 none 不会有任何效果)。在解决此问题之前,我在构建我的 AspNetCore 项目时使用 DebugDotNetCore 和 ReleaseDotNetCore 配置,在构建其他项目时使用 Debug 和 Release 配置。

哦,另请注意,我没有在新的 PropertyGroup 中检查 $(Platform),因此 begin 标签看起来不像往常那样,更像是这样:

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">

那是因为基于 $(Platform) 的任何差异都没有意义。

我还在这些附近添加了一个 xml 评论,基本上是告诉下一个开发者不幸的是 运行 设置任何不同的东西,取决于平台将无法按预期工作,因为 PlatformTarget必须设置为 x64,而 $(Platform) 必须设置为 AnyCPU。

我迫不及待地想摆脱这个问题,但微软似乎不会修复这个问题,直到 Visual Studio 的下一个版本问世,届时 project.json 将是删除,并且(我希望),DotNetCore 最终将真正与 Visual Studio.

集成