2009-10-13 2 views
4

Я разрабатываю корпоративное приложение среднего размера. Существует много проектов/решений. Например:Когда и как использовать ILMerge с Visual Studio Project/Solution

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

Я тогда есть некоторые приложения - например, служба windows: MyWindow sService.

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

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

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

+0

http://stackoverflow.com/questions/9376/ilmerge-best-practices –

ответ

7

Вопрос 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> 
+0

У меня нет опыта работы с написания скриптов MSBuild. Включает ли это также локализованные спутниковые сборки? – Wouter