Мне удалось получить переменную $ (SolutionDir) во время выполнения, используя эту задачу:
<Target Name="GenerateCode" Outputs="$(IntermediateOutputPath)ResourcesPath-Constants.cs">
<Exec Command=
"
echo namespace SRE.Widgets.Blend > $(IntermediateOutputPath)ResourcesPath-Constants.cs
echo { >> $(IntermediateOutputPath)ResourcesPath-Constants.cs
echo public static partial class ResourcesPath >> $(IntermediateOutputPath)ResourcesPath-Constants.cs
echo { >> $(IntermediateOutputPath)ResourcesPath-Constants.cs
echo public static string SOLUTION_DIR = @"$(SolutionDir)"; >> $(IntermediateOutputPath)ResourcesPath-Constants.cs
echo } >> $(IntermediateOutputPath)ResourcesPath-Constants.cs
echo } >> $(IntermediateOutputPath)ResourcesPath-Constants.cs
" />
</Target>
<Target Name="CompileGeneratedCode">
<ItemGroup>
<Compile Include="$(IntermediateOutputPath)ResourcesPath-Constants.cs" />
</ItemGroup>
</Target>
<PropertyGroup>
<CompileDependsOn>
GenerateCode;
CompileGeneratedCode;
$(CompileDependsOn);
</CompileDependsOn>
</PropertyGroup>
У меня проблема в том, что, поскольку у задачи нет «Входов», этот проект всегда создается. Это странно, потому что это нарушает пошаговую компиляцию. Этот проект используется в различных решениях, и я хочу, чтобы он компилировался только при изменении решения.
Я пытался использовать Inputs = "$ (SolutionPath). Это хорошо работает, если вы используете только одно решение, но когда вы используете проект из другого решения, sln.cache повреждается и останавливает построение задачи навсегда. Неважно если вы удалите переменную Inputs. Единственный способ заставить ее работать снова - это удалить файл .sln.cache.
Кто-нибудь знает способ остановить сборку проекта каждый раз?
EDIT:
Ok. Я нашел решение:
<Target Name="GenerateTmpCode">
<Exec
Command=
"
echo namespace SRE.Widgets.Blend > $(IntermediateOutputPath)ResourcesPath-Constants.g.cs.tmp
echo { >> $(IntermediateOutputPath)ResourcesPath-Constants.g.cs.tmp
echo public static partial class ResourcesPath >> $(IntermediateOutputPath)ResourcesPath-Constants.g.cs.tmp
echo { >> $(IntermediateOutputPath)ResourcesPath-Constants.g.cs.tmp
echo public static string SOLUTION_DIR = @"$(SolutionDir)"; >> $(IntermediateOutputPath)ResourcesPath-Constants.g.cs.tmp
echo } >> $(IntermediateOutputPath)ResourcesPath-Constants.g.cs.tmp
echo } >> $(IntermediateOutputPath)ResourcesPath-Constants.g.cs.tmp
fc $(IntermediateOutputPath)ResourcesPath-Constants.g.cs.tmp $(IntermediateOutputPath)ResourcesPath-Constants.g.cs
"
ContinueOnError="true">
<Output PropertyName="CommandExitCode" TaskParameter="ExitCode"/>
</Exec>
</Target>
<Target Name="GenerateCode"
Condition="'$(CommandExitCode)'!='0'"
Outputs="$(IntermediateOutputPath)ResourcesPath-Constants.cs"
Inputs="$(IntermediateOutputPath)ResourcesPath-Constants.g.cs.tmp" >
<Exec Command=
"
copy $(IntermediateOutputPath)ResourcesPath-Constants.g.cs.tmp $(IntermediateOutputPath)ResourcesPath-Constants.g.cs
" />
</Target>
<Target Name="CompileGeneratedCode">
<ItemGroup>
<Compile Include="$(IntermediateOutputPath)ResourcesPath-Constants.g.cs">
<AutoGen>True</AutoGen>
</Compile>
</ItemGroup>
</Target>
<PropertyGroup>
<CompileDependsOn>
GenerateTmpCode;
GenerateCode;
CompileGeneratedCode;
$(CompileDependsOn);
</CompileDependsOn>
</PropertyGroup>
Есть две цели. Первый создает частичный класс, содержащий строку со значением $ (solutiondir) во временном файле, и сравнивает его с текущим используемым частичным классом. Второй копирует временный файл поверх текущего, если это необходимо.