我使用IlMerge在一个exe中合并我项目的所有dll。我使用目标文件,该文件在主csproj的“import”中引用。
目标中的ExecCommand是:
<Exec Command=""$(ProgramFiles)\Microsoft\Ilmerge\Ilmerge.exe" /out:@(MainAssembly) "@(IntermediateAssembly)" @(IlmergeAssemblies->'"%(FullPath)"', ' ')" />
这很有效。
但是我有一个安装项目,当它构建时,它会忽略“导入”并且它不会合并dll。如何在安装项目中使用目标文件?
我尝试在主项目的Post-build事件(在项目的属性中)为Ilmerge编写相同的代码,但它给出了错误代码1.
答案 0 :(得分:2)
我建议您查看MSBuild Community Tasks中的ILMerge任务。 ILMerge任务的文档包含在download中。它将消除您现在正在执行的指定精确命令行参数的复杂性。
在您的具体问题上,除了错误代码1之外,您是否收到任何其他错误消息?评论,我会尽我所能编辑我的回复。
答案 1 :(得分:1)
我的解决方案是: 我把导入在csproj中用于Ilmerge目标文件,这是:
<Project
DefaultTargets="Build"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Target Name="AfterBuild">
<CreateItem Include="@(ReferencePath)" Condition="'%(CopyLocal)'=='true'">
<Output TaskParameter="Include" ItemName="IlmergeAssemblies"/>
</CreateItem>
<Message Text="MERGING: @(IlmergeAssemblies->'%(Filename)')" Importance="High" />
<Exec Command=""$(ProgramFiles)\Microsoft\Ilmerge\Ilmerge.exe" /out:@(MainAssembly) "@(IntermediateAssembly)" @(IlmergeAssemblies->'"%(FullPath)"', ' ') /log:ILMerge.log" />
</Target>
<Target Name="_CopyFilesMarkedCopyLocal"/>
</Project>
然后在安装项目中,我不包括我的exe作为主要输出,我将其包含为文件,以及其本地化资源和内容。
我认为这是有效的,但遗憾的是,在将其打包到安装程序exe之前,我无法执行应用程序的postbuild事件(ilmerge进程)。