Dot-Net

如何在 AfterBuild 中將 ILMerge 與 .NET 4.5 一起使用?

  • January 4, 2013

我們希望將包含多個項目的解決方案升級到 .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=""$(SolutionDir)LIB\ILMerge.exe" /out:@(MainAssembly) /internalize /targetplatform:v4,"$(ReferenceAssemblies)" "@(IntermediateAssembly)" @(AssembliesToMerge->'"%(FullPath)"', ' ')" />
   <Delete Files="@(ReferenceCopyLocalPaths->'$(OutDir)%(DestinationSubDirectory)%(Filename)%(Extension)')" />
</Target>

這應該如何看待 .NET 4.5?

我在這裡讀到,在 .NET 4.5 中使用 ILMerge 存在一些問題。

我找不到任何好的文件,但正如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=""$(SolutionDir)LIB\ILMerge.exe" /out:@(MainAssembly) /internalize /targetplatform:v4,"$(ReferenceAssemblies)" "@(IntermediateAssembly)" @(AssembliesToMerge->'"%(FullPath)"', ' ')" />
   <Delete Files="@(ReferenceCopyLocalPaths->'$(OutDir)%(DestinationSubDirectory)%(Filename)%(Extension)')" />
</Target>

在大多數情況下,.NET 4 程序集的路徑也可以使用,但在 .NET 4.5 中引用新程序集時,需要更新路徑。

請注意,在範例中,ILMerge.exe 被下載到解決方案目錄中名為 LIB 的文件夾中。

引用自:https://stackoverflow.com/questions/14139207