(C #) Ошибка при создании нескольких целевых структур: «Не удается открыть« MyApi.dll »для записи» - PullRequest
0 голосов
/ 14 октября 2019

Я следую этому руководству , чтобы автоматически создать клиент API с NSwag. Но этот клиент должен поддерживать несколько целевых структур:

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

Когда я пытаюсь построить этот клиент, я получаю несколько ошибок, например:

(CS2012) Не удается открыть 'MyApi.dll 'для записи -' Процесс не может получить доступ к файлу 'MyApi.dll', поскольку он используется другим процессом. '

Я подозреваю, что это происходит потому, что каждая инфраструктура создается асинхронно, иDLL, созданная из моего API, пытается быть прочитанной каждым процессом. Как я могу исправить эту проблему / сделать так, чтобы каждая целевая платформа создавалась синхронно?

1 Ответ

1 голос
/ 22 октября 2019

Ну, я нашел решение. Мое отсутствие понимания в отношении руководства , которое я читал, и процесс сборки означал, что я не задавал правильные вопросы.

У меня была указана эта цель сборки в моем .csproj (как указано вруководство):

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

Эта цель выполнялась для каждой целевой структуры , указанной в моем теге <TargetFrameworks>. Это была задача, которая выполнялась параллельно самой себе и вызывала ошибку в моем вопросе.

После МНОГО поиска в Google я нашел этот вопрос и (следовательно этот ответ ), который дал мне необходимое решение:

В многоцелевых средах я использую BeforeTargets="DispatchToInnerBuilds", поэтому моя пользовательская команда запускается только один раз перед каждой сборкой

Такмоя конечная цель сборки была такой простой:

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

Следует также отметить, что это решение может работать не для всех людей, которые ищут свои цели сборки для запуска один раз за сборку. См. комментарий к этой проблеме , который дает аналогичный ответ, но с более подробной информацией о многопроектных решениях.

...