<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <RoslyCompilerFiles Include="$(CscToolPath)\*"> <Link>roslyn\%(RecursiveDir)%(Filename)%(Extension)</Link> </RoslyCompilerFiles> </ItemGroup> <Target Name="IncludeRoslynCompilerFilesToFilesForPackagingFromProject" BeforeTargets="PrepareForRun" > <ItemGroup> <FilesForPackagingFromProject Include="@(RoslyCompilerFiles)"> <DestinationRelativePath>bin\roslyn\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath> <FromTarget>IncludeRoslynCompilerFilesToFilesForPackagingFromProject</FromTarget> <Category>Run</Category> </FilesForPackagingFromProject> </ItemGroup> </Target> <Target Name="CopyRoslynCompilerFilesToOutputDirectory" AfterTargets="CopyFilesToOutputDirectory"> <Copy SourceFiles="@(RoslyCompilerFiles)" DestinationFolder="$(WebProjectOutputDir)\bin\roslyn" ContinueOnError="true" SkipUnchangedFiles="true" Retries="0" /> </Target> <Target Name = "KillVBCSCompilerAndRetryCopy" AfterTargets="CopyRoslynCompilerFilesToOutputDirectory" Condition="'$(MSBuildLastTaskResult)' == 'False'" > <KillProcess ProcessName="VBCSCompiler" ImagePath="$(WebProjectOutputDir)" /> <Copy SourceFiles="@(RoslyCompilerFiles)" DestinationFolder="$(WebProjectOutputDir)\bin\roslyn" ContinueOnError="true" SkipUnchangedFiles="true" /> </Target> <UsingTask TaskName="KillProcess" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll"> <ParameterGroup> <ProcessName ParameterType="System.String" Required="true" /> <ImagePath ParameterType="System.String" Required="true" /> </ParameterGroup> <Task> <Reference Include="System" /> <Reference Include="System.Management" /> <Using Namespace="System" /> <Using Namespace="System.Linq" /> <Using Namespace="System.Diagnostics" /> <Using Namespace="System.Management" /> <Code Type="Fragment" Language="cs"> <![CDATA[ try { foreach(var p in Process.GetProcessesByName(ProcessName)) { var wmiQuery = "SELECT ProcessId, ExecutablePath FROM Win32_Process WHERE ProcessId = " + p.Id; using(var searcher = new ManagementObjectSearcher(wmiQuery)) { using(var results = searcher.Get()) { var mo = results.Cast<ManagementObject>().FirstOrDefault(); Log.LogMessage("ExecutablePath is {0}", (string)mo["ExecutablePath"]); if(mo != null && string.Compare((string)mo["ExecutablePath"], ImagePath, StringComparison.OrdinalIgnoreCase) > 0) { p.Kill(); Log.LogMessage("{0} is killed", (string)mo["ExecutablePath"]); break; } } } } } catch (Exception ex) { Log.LogErrorFromException(ex); } return true; ]]> </Code> </Task> </UsingTask> </Project>