0

我正在按照本指南使用 NSwag 自动生成 API 客户端。但是这个客户端需要支持多个目标框架:

<TargetFrameworks>netcoreapp2.2;net452;net462;net472;net48</TargetFrameworks>

当我尝试构建此客户端时,我收到多个如下错误:

(CS2012)无法打开“MyApi.dll”进行写入——“该进程无法访问文件“MyApi.dll”,因为它正被另一个进程使用。

我怀疑这是因为每个框架都是异步构建的,并且从我的 API 生成的 DLL 正试图被每个进程读取。如何解决此问题/使每个目标框架同步构建?

4

1 回答 1

1

好吧,我找到了解决方案。我对正在阅读的指南和构建过程缺乏了解,这意味着我没有提出正确的问题。

我在 .csproj 中指定了这个构建目标(如指南中所述):

<Target Name="NSwag" BeforeTargets="PrepareForBuild" Condition="'$(GenerateCode)'=='True' ">
  <Exec Command="$(NSwagExe_Core22) run nswag.json /variables:Configuration=$(Configuration)" />
</Target>

这个目标针对我在标签中指定的每个目标框架运行。<TargetFrameworks>这是与自身并行运行并导致我的问题出现错误的任务。

经过更多的谷歌搜索,我发现了这个问题和(因此是这个答案)这给了我需要的解决方案:

在我使用的多目标框架上,BeforeTargets="DispatchToInnerBuilds"因此我的自定义命令仅在每次构建之前执行一次

所以我的最终构建目标就这么简单:

<Target Name="NSwag" BeforeTargets="DispatchToInnerBuilds" Condition="'$(GenerateCode)'=='True' ">
  <Exec Command="$(NSwagExe_Core22) run nswag.json /variables:Configuration=$(Configuration)" />
</Target>

还应注意,此解决方案可能不适用于所有希望构建目标在每个构建中运行一次的人。请参阅此问题评论,该评论提供了类似的答案,但提供了有关多项目解决方案的更多详细信息。

于 2019-10-22T05:00:54.637 回答