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

11

我们希望使用几个项目升级我们的解决方案到.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存在一些问题。


在我的机器上使用相同的配置似乎可以正常工作,但在提交更改之前我想获取更多信息...并且.NET Framework程序集的路径看起来至少应该更新。 - Christian Fredh
在这个问题中找到了一些信息:https://dev59.com/Tmkw5IYBdhLWcg3wGWtk - Christian Fredh
你或许可以使用MSBuildExtensions库来实现这一点。 - leppie
@leppie 那个库看起来很有趣,我在那个库中发现了一个 ILMerge 任务(已经使用ILMerge v2.10.0526进行测试,最新版本是v2.12.0803),尚未测试,至少目前还没有... - Christian Fredh
1个回答

13

我找不到有关此的好文档,但是根据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>

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

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


错误1 命令""d:\Work\DotNetWise\ExcludeLines\LIB\ILMerge.exe" /out:bin\Release\ExcludeLines.exe /internalize /targetplatform:v4,"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5" "obj\Release\ExcludeLines.exe" "d:\Work\DotNetWise\ExcludeLines\packages\CommandLineParser.1.9.71\lib\net45\CommandLine.dll"" 以代码3退出。d:\Work\DotNetWise\ExcludeLines\ExcludeLines\ExcludeLines.csproj 71 5 ExcludeLines - DATEx2
1
可能进一步简化这个过程的一件事是添加NuGet ILMerge包,并在解决方案下的packages文件夹中引用ilmerge.exe文件。 - BlueSam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接