ILMerge를 Visual Studio 빌드 프로세스에 통합하여 어셈블리를 병합하는 방법은 무엇입니까?
VB.NET 콘솔 응용 프로그램 프로젝트에서 참조하는 하나의 .NET DLL 어셈블리와 하나의 C # 클래스 라이브러리 프로젝트를 하나의 명령 줄 콘솔 실행 파일로 병합하고 싶습니다.
명령 줄에서 ILMerge를 사용하여이 작업을 수행 할 수 있지만 참조 어셈블리 및 프로젝트의 병합을 Visual Studio 프로젝트에 통합하려고합니다. 필자는 MSBuild 작업 또는 대상을 통해이 작업을 수행하고 C # / VB.NET 프로젝트 파일에 추가 할 수 있다는 것을 이해하지만 MSBuild는 큰 주제이므로 특정 예제를 찾을 수 없습니다. 또한 빌드 후 이벤트에 ILMerge 명령을 추가하는 몇 가지 참조를 찾습니다.
ILMerge를 MSBuild 프로젝트 인 Visual Studio (C # / VB.NET) 프로젝트에 통합하여 참조 된 모든 어셈블리 (copy-local = true)를 하나의 어셈블리로 병합하려면 어떻게해야합니까?
이것이 가능한 ILMerge.Targets 파일과 어떻게 연결됩니까?
빌드 후 이벤트를 사용하는 것이 더 낫습니까?
" 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=""$(MSBuildThisFileDirectory)Ilmerge.exe" /lib:$(MSBuildBinPath) /targetplatform:v4 /out:@(MainAssembly) "$(MSBuildProjectDirectory)\@(IntermediateAssembly)" @(IlmergeAssemblies->'"%(FullPath)"', ' ')" />
업데이트 나는 또한 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) -> $(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=""$(SolutionDir)packages\ILMerge.2.13.0307\Ilmerge.exe" /wildcards /out:"$(SolutionDir)..\$(TargetFileName)" "$(TargetPath)" $(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
'IT박스' 카테고리의 다른 글
경고 : 원격 HEAD는 존재하지 않는 참조를 참조하므로 체크 아웃 할 수 없습니다. (0) | 2020.10.27 |
---|---|
React-단일 구성 요소의 마운트 및 마운트 해제 애니메이션 (0) | 2020.10.27 |
numpy 배열의 n 번째 항목마다 서브 샘플링 (0) | 2020.10.27 |
HTTP 양식에서 HTTPS로 제출하는 것이 안전합니까? (0) | 2020.10.27 |
'const auto'에는 어떤 의미가 있습니까? (0) | 2020.10.27 |