Я решил эту проблему, немного взломав мой файл SubsetFontSilverlight.target. Это не полное исправление, и оно не обязательно будет работать для всех, но оно работает для меня.
Целевой файл можно найти в C: \ Program Files \ MSBuild \ Microsoft \ Expression \ Blend \ Silverlight \ v4.0, по крайней мере, на моем компьютере.
Основная идея здесь состоит в том, чтобы использовать целевые свойства Input / Ouput MSBUILD, чтобы увидеть, нужно ли обновлять промежуточный файл (ы) Font.zip. Я просто жестко запрограммировал путь к выходному файлу, потому что я всегда использую расположение шрифтов Blend по умолчанию, но его можно создать из отдельных файлов шрифтов.
Я установил условие, что задание должно быть пропущено, если файл Font.zip новее, чем файлы встроенных шрифтов и файл проекта. Таким образом, если вы добавляете / вычитаете шрифт или заменяете один из них, шрифты будут повторно встроены, но если нет никаких изменений (или только изменений кода), font.zip останется один.
Важно добавить fonts.zip в коллекцию ресурсов вручную, если шрифты не внедрены - таким образом, если код нужно перекомпилировать, но шрифты можно оставить в покое, msbuild не забывает включить файл шрифтов в ресурсы , Вот почему я добавил новую задачу для запуска после основной задачи встраивания.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask AssemblyFile="SubsetFontTask.dll" TaskName="Microsoft.Expression.SubsetFontTask.SubsetFontsSilverlight" />
<UsingTask AssemblyFile="SubsetFontTask.dll" TaskName="Microsoft.Expression.SubsetFontTask.CleanSubsetFonts" />
<ItemGroup Condition="'$(BuildingInsideVisualStudio)'=='true'">
<AvailableItemName Include="BlendEmbeddedFont"/>
</ItemGroup>
<ItemGroup>
<!-- Files that we specify as target inputs for msbuild target timestamp check -->
<FontEmbedRelatedFile Include="$(MSBuildProjectFile)" />
<FontEmbedRelatedFile Include="@(BlendEmbeddedFont)" />
<!-- Anticipated font file locations -->
<FontOutputFile Include="$(IntermediateOutputPath)\Fonts\Fonts.zip" />
</ItemGroup>
<!--
this task runs after the main subset task - basically it checks if the task got skipped, and if so
it adds the projected font output files to the resources collection
-->
<Target Name='AfterFontEmbed' AfterTargets="SubsetFontsSilverlight"
Condition="'@(BlendEmbeddedFont)' != '' AND '@(BlendSubsettedFont)' == ''">
<Message Text="Adding font files to the resource collection because Font embed was skipped" Importance="normal" />
<ItemGroup>
<Resource Include="@(FontOutputFile)" />
</ItemGroup>
</Target>
<Target Name='SubsetFontsSilverlight'
Inputs="@(FontEmbedRelatedFile)" Outputs="@(FontOutputFile)"
DependsOnTargets="$(SubsetFontsDependsOn)"
Condition="'@(BlendEmbeddedFont)' != ''">
<Message Text="Embedding font subsets" Importance="normal" />
<SubsetFontsSilverlight
Fonts="@(BlendEmbeddedFont)" XamlFiles="@(Page)" Resources="@(Resources)"
IntermediateFilesDirectory="$(IntermediateOutputPath)"
>
<Output TaskParameter="SubsettedFonts" ItemName="Resource"/>
<!-- save our list of embedded font files for later use -->
<Output TaskParameter="SubsettedFonts" ItemName="BlendSubsettedFont"/>
</SubsetFontsSilverlight>
</Target>
<Target Name='CleanSubsetFonts' DependsOnTargets="$(CleanSubsetFontsDependsOn)" Condition="'@(BlendEmbeddedFont)' != ''">
<CleanSubsetFonts
Fonts="@(BlendEmbeddedFont)"
IntermediateFilesDirectory="$(IntermediateOutputPath)"
/>
</Target>
<PropertyGroup>
<PrepareResourcesDependsOn>
SubsetFontsSilverlight;
$(PrepareResourcesDependsOn);
</PrepareResourcesDependsOn>
</PropertyGroup>
<PropertyGroup>
<CleanDependsOn>
$(CleanDependsOn);
CleanSubsetFonts;
</CleanDependsOn>
</PropertyGroup>
</Project>
Visual Studio все еще не замечает того, что проекты обновлены, но когда она их строит, задача corecompile не будет запускаться каждый раз, и файл dll не будет перезаписываться без необходимости. Это означает, что вы можете запустить компилятор в командной строке, установить VS в «Never Build» при отладке, и при этом все равно иметь загруженные правильные символы отладки.
Я проверил это в большинстве ситуаций, о которых мог подумать (до / после очистки, пропущенных файлах, только изменениях кода, изменениях в проекте и т. Д.), И, кажется, все в порядке - это означает, что шрифты есть, а все нет. не всегда перекомпилируется.