Проблема связана с промежуточными файлами, но есть другое решение, которое состоит в очистке этих промежуточных файлов перед построением представлений.
Это решение было включено в некоторую версию VS, но я могу только сказать, что у меня была проблема в VS 2013 Update 5. (см. «Осторожно» ниже, это может быть исправлено в этой версии, но не работает только в моем конкретном нестандартный корпус).
Я позаимствовал решение из Error: allowDefinition = 'MachineToApplication' за пределами уровня приложения в Visual Studio Connect.
Решение состоит во включении этих строк в проект ( .csproj
файл) веб-приложения, которые обрабатывают удаление промежуточных файлов offedning:
<!--Deal with http://connect.microsoft.com/VisualStudio/feedback/details/779737/error-allowdefinition-machinetoapplication-beyond-application-level,
we will need to clean up our temp folder before MVC project starts the pre-compile-->
<PropertyGroup>
<_EnableCleanOnBuildForMvcViews Condition=" '$(_EnableCleanOnBuildForMvcViews)'=='' ">true</_EnableCleanOnBuildForMvcViews>
</PropertyGroup>
<Target Name="CleanupForBuildMvcViews" Condition=" '$(_EnableCleanOnBuildForMvcViews)'=='true' and '$(MVCBuildViews)'=='true' " BeforeTargets="MvcBuildViews">
<ItemGroup>
<_PublishTempFolderNamesToCleanup Include="Database;TransformWebConfig;CSAutoParameterize;InsertAdditionalCS;ProfileTransformWebConfig;Package;AspnetCompileMerge" />
</ItemGroup>
<!--Force msbuild to expand all the wildcard characters so to get real file paths-->
<CreateItem Include="@(_PublishTempFolderNamesToCleanup->'$(BaseIntermediateOutputPath)**\%(identity)\**\*')">
<Output TaskParameter="Include" ItemName="_EvaluatedPublishTempFolderNamesToCleanup" />
</CreateItem>
<Delete Files="@(_EvaluatedPublishTempFolderNamesToCleanup)" />
</Target>
Осторожно: по какой-то причине, вероятно, потому, что я сам включил его в проект, моя цель сборки для построения представлений была названа "BuildViews"
вместо "MvcBuildViews"
, поэтому мне пришлось соответствующим образом изменить BeforeTargets
атрибут. Я также упростил цель, удалив PropertyGroup
и упростив условие, например:
<Target Name="CleanupForBuildMvcViews" Condition="'$(MVCBuildViews)'=='true' " BeforeTargets="BuildViews">
<ItemGroup>
<_PublishTempFolderNamesToCleanup Include="Database;TransformWebConfig;CSAutoParameterize;InsertAdditionalCS;ProfileTransformWebConfig;Package;AspnetCompileMerge" />
</ItemGroup>
<!--Force msbuild to expand all the wildcard characters so to get real file paths-->
<CreateItem Include="@(_PublishTempFolderNamesToCleanup->'$(BaseIntermediateOutputPath)**\%(identity)\**\*')">
<Output TaskParameter="Include" ItemName="_EvaluatedPublishTempFolderNamesToCleanup" />
</CreateItem>
<Delete Files="@(_EvaluatedPublishTempFolderNamesToCleanup)" />
</Target>