IT박스

ILMerge를 Visual Studio 빌드 프로세스에 통합하여 어셈블리를 병합하는 방법은 무엇입니까?

itboxs 2020. 10. 27. 07:57
반응형

ILMerge를 Visual Studio 빌드 프로세스에 통합하여 어셈블리를 병합하는 방법은 무엇입니까?


VB.NET 콘솔 응용 프로그램 프로젝트에서 참조하는 하나의 .NET DLL 어셈블리와 하나의 C # 클래스 라이브러리 프로젝트를 하나의 명령 줄 콘솔 실행 파일로 병합하고 싶습니다.

명령 줄에서 ILMerge를 사용하여이 작업을 수행 할 수 있지만 참조 어셈블리 및 프로젝트의 병합을 Visual Studio 프로젝트에 통합하려고합니다. 필자는 MSBuild 작업 또는 대상을 통해이 작업을 수행하고 C # / VB.NET 프로젝트 파일에 추가 할 수 있다는 것을 이해하지만 MSBuild는 큰 주제이므로 특정 예제를 찾을 수 없습니다. 또한 빌드 후 이벤트에 ILMerge 명령을 추가하는 몇 가지 참조를 찾습니다.

  1. ILMerge를 MSBuild 프로젝트 인 Visual Studio (C # / VB.NET) 프로젝트에 통합하여 참조 된 모든 어셈블리 (copy-local = true)를 하나의 어셈블리로 병합하려면 어떻게해야합니까?

  2. 이것이 가능한 ILMerge.Targets 파일과 어떻게 연결됩니까?

  3. 빌드 후 이벤트를 사용하는 것이 더 낫습니까?


" MSBuild ILMerge 작업 "(또는 MSBuild.ILMerge.Task) NuGet 패키지를 사용하면이 프로세스가 매우 간단 해집니다. 기본적으로 "로컬 복사"참조를 주 어셈블리로 병합합니다.

참고 : 패키지 이름은 비슷하지만이 이름 ILMerge.MSBuild.Tasks은 Davide Icardi가 답변 에서 언급 한 것과 다릅니다 . 제가 여기서 제안하는 것은 2014 년 8 월에 처음 출판되었습니다.


Scott Hanselman의 솔루션을 구현하는 사람들에게 유용 할 수있는 추가 정보 .

내가 이것을 처음 설정할 때 System.Core 등에 대한 참조를 확인할 수 없다는 불만을 토로 할 것입니다. .NET 4 지원과 관련이 있습니다. .NET 4 Framework 디렉터리를 가리키는 / lib 인수를 포함하면 문제가 해결됩니다 (사실 $ (MSBuildBinPath) 만 포함).

/lib:$(MSBuildBinPath)

그런 다음 병합하는 동안 IlMerge가 중단된다는 것을 알았습니다. 약간의 CPU와 많은 RAM을 사용했지만 아무것도 출력하지 않았습니다. 물론 stackoverflow에 대한 수정 사항 찾았습니다 .

/targetplatform:v4

또한 Scott의 블로그 기사에 사용 된 MSBuild 속성 중 일부가 프로젝트 디렉터리에서 MsBuild를 실행하는 데 의존한다는 것을 발견하여 약간 수정했습니다.

그런 다음 targets & ilmerge.exe를 소스 트리의 도구 폴더로 이동하여 경로를 약간 조정해야합니다.

마침내 Scott의 원본 기사에서 다음과 같은 Exec 요소로 대체되었습니다.

<Exec Command="&quot;$(MSBuildThisFileDirectory)Ilmerge.exe&quot; /lib:$(MSBuildBinPath) /targetplatform:v4 /out:@(MainAssembly) &quot;$(MSBuildProjectDirectory)\@(IntermediateAssembly)&quot; @(IlmergeAssemblies->'&quot;%(FullPath)&quot;', ' ')" /> 

업데이트 나는 또한 CopyLocal 동작을 유지하고 Nuget 패키지를 사용하는 경우 CopyLocal 필수에서 ilMerged 어셈블리를 제외하는 것에 대한 Logic Labs의 답변을 찾았습니다 . 그렇지 않으면 병합되지 않는 참조 된 어셈블리의 각 패키지 디렉터리에 대해 / lib 인수를 지정해야합니다.


다음은 대체 솔루션입니다.

1) 너겟에서 ILMerge.MSBuild.Tasks 패키지 설치

PM> 설치 패키지 ILMerge.MSBuild.Tasks

2) 아래 코드를 추가하여 병합하려는 프로젝트의 * .csproj 파일을 편집합니다.

  <!-- Code to merge the assemblies into one:setup.exe -->
  <UsingTask TaskName="ILMerge.MSBuild.Tasks.ILMerge" AssemblyFile="$(SolutionDir)\packages\ILMerge.MSBuild.Tasks.1.0.0.3\tools\ILMerge.MSBuild.Tasks.dll" />
  <Target Name="AfterBuild">
    <ItemGroup>
      <MergeAsm Include="$(OutputPath)$(TargetFileName)" />
      <MergeAsm Include="$(OutputPath)LIB1_To_MERGE.dll" />
      <MergeAsm Include="$(OutputPath)LIB2_To_MERGE.dll" />
    </ItemGroup>
    <PropertyGroup>
      <MergedAssembly>$(ProjectDir)$(OutDir)MERGED_ASSEMBLY_NAME.exe</MergedAssembly>
    </PropertyGroup>
    <Message Text="ILMerge @(MergeAsm) -&gt; $(MergedAssembly)" Importance="high" />
    <ILMerge InputAssemblies="@(MergeAsm)" OutputFile="$(MergedAssembly)" TargetKind="SameAsPrimaryAssembly" />
  </Target>

3) 평소와 같이 프로젝트를 빌드하십시오.


기사 원활 ILMerge와의 MSBuild와 Visual Studio에서 단일 총회에서 언어를 혼합 에서 http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamlesslyWithILMergeAndMSBuild.aspx는 비주얼 스튜디오 프로젝트에서 ILMerge와의 MSBuild를 사용하는 방법을 보여줍니다.


http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamlesslyWithILMergeAndMSBuild.aspx 에서 기사에서 찾은 한 가지 문제 .

ILMerge를 원하지 않는 참조가있는 경우 문서의 코드는 기본 CopyLocal 동작을 재정 의하여 아무 작업도 수행하지 않기 때문에 실패합니다.

이 문제를 해결하려면-대신 :

<Target Name="_CopyFilesMarkedCopyLocal"/> 

대신 대상 파일에이 항목을 추가합니다 (.NET 3.5에만 해당) (비 ilmerge copylocal 파일을 필터링하고 정상으로 처리).

<Target Name="AfterResolveReferences">
    <Message Text="Filtering out ilmerge assemblies from ReferenceCopyLocalPaths" Importance="High" />
    <ItemGroup>
        <ReferenceCopyLocalPaths Remove="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.IlMerge)'=='true'" />
    </ItemGroup>
</Target>

This is a great article that will show you how to merge your referenced assemblies into the output assembly. It shows exactly how to merge assemblies using msbuild.


My 2 cents - I picked up @Jason's response and made it work for my solution where I wanted to generate the *.exe in the bin/Debug folder with all *.dlls inside the same folder.

<Exec Command="&quot;$(SolutionDir)packages\ILMerge.2.13.0307\Ilmerge.exe&quot; /wildcards /out:&quot;$(SolutionDir)..\$(TargetFileName)&quot; &quot;$(TargetPath)&quot; $(OutDir)*.dll" /> 

Note: This solution is obviously hardcoded into the ILMerge nuget package version. Please let me know if you have some suggestions to improve.


Check out this article by Jomo. He has a quick process to hack ILMerge into the msbuild system

참고URL : https://stackoverflow.com/questions/2556048/how-to-integrate-ilmerge-into-visual-studio-build-process-to-merge-assemblies

반응형