You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

104 lines
5.4 KiB

4 years ago
  1. <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  2. <Import Project="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.Extensions.props"/>
  3. <ItemGroup>
  4. <RoslynCompilerFiles Include="$(RoslynToolPath)\*">
  5. <Link>roslyn\%(RecursiveDir)%(Filename)%(Extension)</Link>
  6. </RoslynCompilerFiles>
  7. </ItemGroup>
  8. <Target Name="IncludeRoslynCompilerFilesToFilesForPackagingFromProject" BeforeTargets="PipelineCollectFilesPhase" >
  9. <ItemGroup>
  10. <FilesForPackagingFromProject Include="@(RoslynCompilerFiles)">
  11. <DestinationRelativePath>bin\roslyn\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
  12. <FromTarget>IncludeRoslynCompilerFilesToFilesForPackagingFromProject</FromTarget>
  13. <Category>Run</Category>
  14. </FilesForPackagingFromProject>
  15. </ItemGroup>
  16. </Target>
  17. <Target Name="LocateRoslynToolsDestinationFolder" Condition=" '$(RoslynToolsDestinationFolder)' == '' ">
  18. <PropertyGroup>
  19. <RoslynToolsDestinationFolder>$(WebProjectOutputDir)\bin\roslyn</RoslynToolsDestinationFolder>
  20. <RoslynToolsDestinationFolder Condition=" '$(WebProjectOutputDir)' == '' ">$(OutputPath)\roslyn</RoslynToolsDestinationFolder>
  21. </PropertyGroup>
  22. </Target>
  23. <Target Name="CopyRoslynCompilerFilesToOutputDirectory" AfterTargets="CopyFilesToOutputDirectory" DependsOnTargets="LocateRoslynToolsDestinationFolder">
  24. <Copy SourceFiles="@(RoslynCompilerFiles)" DestinationFolder="$(RoslynToolsDestinationFolder)" ContinueOnError="true" SkipUnchangedFiles="true" Retries="0" />
  25. <ItemGroup Condition="'$(MSBuildLastTaskResult)' == 'True'" >
  26. <FileWrites Include="$(RoslynToolsDestinationFolder)\*" />
  27. </ItemGroup>
  28. </Target>
  29. <Target Name="CheckIfShouldKillVBCSCompiler">
  30. <CheckIfVBCSCompilerWillOverride src="$(RoslynToolPath)\VBCSCompiler.exe" dest="$(RoslynToolsDestinationFolder)\VBCSCompiler.exe">
  31. <Output TaskParameter="WillOverride" PropertyName="ShouldKillVBCSCompiler" />
  32. </CheckIfVBCSCompilerWillOverride>
  33. </Target>
  34. <Target Name = "KillVBCSCompilerBeforeCopy" BeforeTargets="CopyRoslynCompilerFilesToOutputDirectory" DependsOnTargets="LocateRoslynToolsDestinationFolder;CheckIfShouldKillVBCSCompiler" >
  35. <KillProcess ProcessName="VBCSCompiler" ImagePath="$(RoslynToolsDestinationFolder)" Condition="'$(ShouldKillVBCSCompiler)' == 'True'" />
  36. </Target>
  37. <Target Name = "KillVBCSCompilerBeforeClean" AfterTargets="BeforeClean" DependsOnTargets="LocateRoslynToolsDestinationFolder">
  38. <KillProcess ProcessName="VBCSCompiler" ImagePath="$(RoslynToolsDestinationFolder)" />
  39. </Target>
  40. <UsingTask TaskName="KillProcess" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
  41. <ParameterGroup>
  42. <ProcessName ParameterType="System.String" Required="true" />
  43. <ImagePath ParameterType="System.String" Required="true" />
  44. </ParameterGroup>
  45. <Task>
  46. <Reference Include="System" />
  47. <Reference Include="System.Management" />
  48. <Using Namespace="System" />
  49. <Using Namespace="System.Linq" />
  50. <Using Namespace="System.Diagnostics" />
  51. <Using Namespace="System.Management" />
  52. <Code Type="Fragment" Language="cs">
  53. <![CDATA[
  54. try
  55. {
  56. foreach(var p in Process.GetProcessesByName(ProcessName))
  57. {
  58. var wmiQuery = "SELECT ProcessId, ExecutablePath FROM Win32_Process WHERE ProcessId = " + p.Id;
  59. using(var searcher = new ManagementObjectSearcher(wmiQuery))
  60. {
  61. using(var results = searcher.Get())
  62. {
  63. var mo = results.Cast<ManagementObject>().FirstOrDefault();
  64. Log.LogMessage("ExecutablePath is {0}", (string)mo["ExecutablePath"]);
  65. if(mo != null && ((string)mo["ExecutablePath"]).StartsWith(ImagePath, StringComparison.OrdinalIgnoreCase))
  66. {
  67. p.Kill();
  68. p.WaitForExit();
  69. Log.LogMessage("{0} is killed", (string)mo["ExecutablePath"]);
  70. break;
  71. }
  72. }
  73. }
  74. }
  75. }
  76. catch (Exception ex)
  77. {
  78. Log.LogErrorFromException(ex);
  79. }
  80. return true;
  81. ]]>
  82. </Code>
  83. </Task>
  84. </UsingTask>
  85. <UsingTask TaskName="CheckIfVBCSCompilerWillOverride" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
  86. <ParameterGroup>
  87. <Src ParameterType="System.String" Required="true" />
  88. <Dest ParameterType="System.String" Required="true" />
  89. <WillOverride ParameterType="System.Boolean" Output="true" />
  90. </ParameterGroup>
  91. <Task>
  92. <Reference Include="System.IO" />
  93. <Code Type="Fragment" Language="cs">
  94. <![CDATA[
  95. WillOverride = false;
  96. try {
  97. WillOverride = File.Exists(Src) && File.Exists(Dest) && (File.GetLastWriteTime(Src) != File.GetLastWriteTime(Dest));
  98. }
  99. catch { }
  100. ]]>
  101. </Code>
  102. </Task>
  103. </UsingTask>
  104. </Project>