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?

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

4

1 回答 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 的文件夹中。

于 2013-01-04T08:17:36.807 回答