如何在AfterBuild中使用ILMerge和.NET 4.5?

Chr*_*edh 10 .net msbuild ilmerge .net-4.5 visual-studio-2012

我们想要将几个项目的解决方案升级到.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>
Run Code Online (Sandbox Code Playgroud)

这应该如何看待.NET 4.5?

我在这里读到使用ILMerge和.NET 4.5存在一些问题.

Chr*_*edh 12

我找不到任何关于此的好文档,但正如Matt Wrocks博客文章关于ILMerge的另一个问题所建议的那样,我首先尝试使用与.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>
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,.NET 4程序集的路径也可以工作,但在.NET 4.5中引用新程序集时,需要更新路径.

请注意,在示例中,ILMerge.exe将下载到名为LIB的解决方案目录中的文件夹中.