Как использовать ILMerge с .NET 4.5 в AfterBuild?

Мы хотим обновить наше решение несколькими проектами до .NET 4.5. Мы уже используем Visual Studio 2012. Мы используем ILMerge для объединения сборок в один EXE.

Наш текущий файл .csproj для основного проекта выглядит следующим образом:

<Target Name="AfterBuild" Condition=" '$(Configuration)' == 'Release' ">
    <CreateItem Include="@(ReferenceCopyLocalPaths)" Condition="'%(Extension)'=='.dll'">
        <Output ItemName="AssembliesToMerge" TaskParameter="Include" />
    </CreateItem>
    <PropertyGroup>
        <ReferenceAssemblies>C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0</ReferenceAssemblies>
    </PropertyGroup>
    <Message Importance="high" Text="Executing ILMerge...with target platform from $(ReferenceAssemblies)" />
    <Exec Command="&quot;$(SolutionDir)LIB\ILMerge.exe&quot; /out:@(MainAssembly) /internalize /targetplatform:v4,&quot;$(ReferenceAssemblies)&quot; &quot;@(IntermediateAssembly)&quot; @(AssembliesToMerge->'&quot;%(FullPath)&quot;', ' ')" />
    <Delete Files="@(ReferenceCopyLocalPaths->'$(OutDir)%(DestinationSubDirectory)%(Filename)%(Extension)')" />
</Target>

Как это должно выглядеть .NET 4.5?

Я прочитал здесь, что есть некоторые проблемы с использованием ILMerge с .NET 4.5.

Ответ 1

Я не могу найти хорошую документацию по этому поводу, но, как было предложено сообщение блога Matt Wrocks и еще один вопрос об ILMerge, я сначала попытался использовать тот же путь Reference Assemblies, что и для .NET 4.

Казалось, что это работает сначала, прежде чем перенаправлять наши пакеты NuGet на .NET 4.5. (В частности, Microsoft.AspNet.WebApi.Client, который добавляет ссылку на новую сборку .NET 4.5 System.Net.Http.WebRequest, которая ранее была включена в пакет NuGet.)

После обновления пути сборки ссылок на .NET 4.5 он работал:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5

<Target Name="AfterBuild" Condition=" '$(Configuration)' == 'Release' ">
    <CreateItem Include="@(ReferenceCopyLocalPaths)" Condition="'%(Extension)'=='.dll'">
        <Output ItemName="AssembliesToMerge" TaskParameter="Include" />
    </CreateItem>
    <PropertyGroup>
        <ReferenceAssemblies>C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5</ReferenceAssemblies>
    </PropertyGroup>
    <Message Importance="high" Text="Executing ILMerge...with target platform from $(ReferenceAssemblies)" />
    <Exec Command="&quot;$(SolutionDir)LIB\ILMerge.exe&quot; /out:@(MainAssembly) /internalize /targetplatform:v4,&quot;$(ReferenceAssemblies)&quot; &quot;@(IntermediateAssembly)&quot; @(AssembliesToMerge->'&quot;%(FullPath)&quot;', ' ')" />
    <Delete Files="@(ReferenceCopyLocalPaths->'$(OutDir)%(DestinationSubDirectory)%(Filename)%(Extension)')" />
</Target>

В большинстве случаев также будет работать путь к сборкам .NET 4, но при обращении к новым сборкам в .NET 4.5 путь должен быть обновлен.

Обратите внимание, что в примере ILMerge.exe загружается в папку в каталоге решений LIB.