【问题标题】:When & How to use ILMerge with Visual Studio Project / Solution何时以及如何将 ILMerge 与 Visual Studio 项目/解决方案一起使用
【发布时间】:2009-10-13 17:00:14
【问题描述】:

我正在开发一个中型企业应用程序。 有很多项目/解决方案。 例如:

  • 公司数据
    • Company.Data.LinqToSql
  • Company.Entities(业务对象)
  • 公司.BLL

然后我有一些应用程序 - 例如 Windows 服务: 我的 Windows 服务。

当我部署它(通过创建安装项目)时,它会从上述项目的输出中安装大量 DLL。

这是我应该使用 ILMerge 的地方吗?创建一个程序集.... Company.dll 例如?

我将如何将其集成到我的构建过程中?

【问题讨论】:

标签: visual-studio build-process ilmerge


【解决方案1】:

问题ILMerge Best Practices 关于为什么有很好的信息。

当我使用 ILMerge 时,我使用它来构建单个 DLL,以简化部署。

至于如何,我定义了一个单独的自定义 VS 项目,“Converged.csproj”,如果你愿意的话。在那个 .csproj 文件中,我定义了一个自定义编译目标。它是样板代码,对项目的所有引用程序集执行 ILMerge。

看起来像这样:

<Target Name="Compile">
  <!-- Outputs="$(IntermediateOutputPath)$(TargetFileName)" -->
  <!-- Outputs="$(TargetPath)" -->
  <Message Text="Performing the Ilmerge." />
  <!-- in this CreateItem stanza, we collect all the DLLs for the referenced projects -->
  <CreateItem Include="@(_ResolvedProjectReferencePaths)">
    <Output TaskParameter="Include" ItemName="AssembliesToMerge" />
  </CreateItem>
  <!-- This weird bit of hieroglyphics is the assemblies to merge, quoted, and separated by spaces -->
  <!-- Example:  "c:\foo\project1\bin\Debug\ProjectOne.dll"   "c:\foo\project2\bin\Debug\ProjectTwo.dll"  -->
  <Message Text="AssembliesToMerge= @(AssembliesToMerge -> '&quot;%(Fullpath)&quot;', ' ')" />
  <!-- Message Text="TargetPath= $(TargetPath)" / -->
  <Message Text="TargetFileName= $(TargetFileName)" />
  <!-- produce the merged assembly - putting the output in the "IntermediateOutputPath" eg obj\Debug. -->
  <!-- it will be copied later by the CopyFilestoOutputDirectory task defined in Microsoft.Common.Targets -->

  <Error
     Text="ILMerge cannot be found. You need to download and install ILMerge in order to build DotNetZip."
     Condition="!Exists('$(ProgramFiles)\Microsoft\Ilmerge\Ilmerge.exe')" />

  <Exec Command="&quot;$(ProgramFiles)\Microsoft\Ilmerge\Ilmerge.exe&quot;  /t:library  /xmldocs /out:&quot;$(IntermediateOutputPath)$(TargetFileName)&quot;  @(AssembliesToMerge -> '&quot;%(Fullpath)&quot;', ' ') " />

  <!-- for some reason the XML doc file does not get copied automatically from obj\Debug to bin\Debug. -->
  <!-- we do it here explicitly. -->
  <Copy SourceFiles="$(IntermediateOutputPath)$(AssemblyName).XML" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true" OverwriteReadOnlyFiles="$(OverwriteReadOnlyFiles)" />
</Target>

【讨论】:

  • 我没有编写 MSBuild 脚本的经验。这是否还包括本地化的附属程序集?
猜你喜欢
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
  • 2010-10-15
相关资源
最近更新 更多