In this solution I have 2 apps:
AppB that share class library
Shared. I have tried automating the build/running of these in parallel with both a PowerShell and node scripts (I’d be open to other solutions). I’m using both
--no-restore flags, but intermittently I get:
'CSC : error CS2012: Cannot open \'C:\\Users\\User\\source\\repos\\ParallelBuild\\Shared\\obj\\Debug\\netcoreapp2.0\\Shared.dll\' for writing -- \'The process cannot access the file \'C:\\Users\\User\\source\\repos\\ParallelBuild\\Shared\\obj\\Debug\\netcoreapp2.0\\Shared.dll\' because it is being used by another process.\' [C:\\Users\\User\\source\\repos\\ParallelBuild\\Shared\\Shared.csproj]\r\n'
Why is the
Shared project building even with the
--no-dependencies flag? How do I build in parallel or simultaneously?
Here is Solutions:
We have many solutions to this problem, But we recommend you to use the first solution because it is tested & true solution that will 100% work for you.
Explanation for error CS2012 :The process cannot access the file
I could reproduce your issue and Process Monitor indicates that both processes open
shared.dll at the same time for reading. This leads to the issue you described.
Although reading the same file from different processes can be done by using
FileShare.Read as the documentation indicates (see excerpt below), it seems that this is NOT done by
csc.exe. This is a shortcoming of
csc.exe, which probably won’t be changed in the near future.
Allows subsequent opening of the file for reading. If this flag is not
specified, any request to open the file for reading (by this process
or another process) will fail until the file is closed. However, even
if this flag is specified, additional permissions might still be
needed to access the file.
Instead of using
Start-Process to achieve parallel building, you could use msbuild, which supports this out of the box.
Parallel build is supported by msbuild with
BuildInParallel-task parameter as described in MS build documentation.
Parallel build is enabled by using
/maxcpucount-switch on commandline:
dotnet msbuild .\ParallelBuildAB.csproj /target:build /restore:false
In addition it is also necessary to use
BuildInParallel-task Parameter in project-file ParallelBuildAB.csproj. Please note that
AppB.csproj are referenced:
<?xml version="1.0"?> <Project name="system" default="build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Target Name="build"> <MSBuild BuildInParallel="true" Projects="./AppA/AppA.csproj;./AppB/AppB.csproj" Targets="Build"/> </Target> </Project>
Note: Use and implement solution 1 because this method fully tested our system.
Thank you 🙂