Когда и как использовать ILMerge с проектом / решением Visual Studio

Я разрабатываю корпоративное приложение среднего размера. На этот счет есть много проектов / решений. Например:

  • Company.Data
    • Company.Data.LinqToSql
  • Company.Entities (бизнес-объекты)
  • Компания.BLL

Затем у меня есть несколько приложений - например, служба Windows: MyWindowsService.

Когда я развертываю это (путем создания проекта установки), он устанавливает загрузку DLL из результатов вышеупомянутых проектов.

Здесь я должен использовать ILMerge? создать одну сборку .... Company.dll например?

Как мне интегрировать это в свой процесс сборки?


person Alex    schedule 13.10.2009    source источник
comment
stackoverflow.com/questions/9376/ilmerge-best-practices   -  person Keith Adler    schedule 13.10.2009


Ответы (1)


Вопрос ILMerge Best Practices содержит полезную информацию о том, почему.

Когда я использую ILMerge, я использую его для создания одной библиотеки DLL, чтобы упростить развертывание.

Что касается How, я определяю отдельный настраиваемый проект 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>
person Cheeso    schedule 14.10.2009
comment
У меня нет опыта написания скриптов MSBuild. Включает ли это также локализованные вспомогательные сборки? - person Wouter; 15.09.2011