여러 어셈블리를 하나로 병합하는 방법은 무엇입니까?


87

다음 서비스 스택의 DLL 및 일부 Azure의 DLL을 EXE 프로젝트에 복사했다는 점에서 EXE 프로젝트 (푸른 응용 프로그램의 시작 작업)를 사용하여 서비스 스택을 사용합니다.

DLL

이 EXE 프로젝트를 빌드하면 Azure DLL이 내 EXE와 함께 번들로 제공되지만 서비스 스택의 DLL은 EXE와 함께 번들로 제공되지 않습니다. 모든 컴퓨터에서 EXE를 실행하려면 모든 서비스 스택의 DLL을 수동으로 복사해야하기 때문입니다.

이 서비스 스택의 dll을 사용하여

JsonServiceClient client = new JsonServiceClient(servicepath);

이 모든 DLL을 EXE에 번들로 묶으려면 어떻게해야합니까?

답변:


120

몇 가지 옵션이 있습니다.

또는

  • SmartAssembly (상용) 와 같은 도구를 사용하여
    다른 것들 사이에 포함하고 병합 할 수 있습니다 (소스 코드를 변경할 필요 없음).

또는

  • 10 줄 미만의 코드 (무료이지만 최소한의 소스 코드 변경)는
    필요한 모든 종속성을 "임베디드 리소스"로 표시합니다. 이렇게하면 EXE 파일에 포함됩니다. AssemblyResolve런타임시 리소스에서 읽는 핸들러 를 설정해야합니다. 필요한 DLL을 .NET 런타임에 반환합니다.

4
Jeffrey Richter의 어셈블리 임베딩 솔루션을 상기시켜 주셔서 감사합니다! 이것을 필요한 코드 삽입과 결합하는 도구에 대해서는 Costura 를 언급하는 내 대답을 참조하십시오 .
CodeFox 2015 년

29

찾고있는 도구는 ILMerge 입니다. 명령 줄 도구이며 다음과 같이 사용할 수 있습니다.

ilmerge /target:winexe /out:MyApp.exe 
        MyExe.exe ServiceStack.dll ServiceStack.Interfaces.dll ServiceStack.ServiceInterface.dll  ServiceStack.Text.dll

ILMerge를 VS 프로젝트 설정에 포함하는 방법을 설명하는 문서도 여기에 있습니다.


안녕하세요, 외부 리소스 (파일 / 이미지)를 실행 파일에 추가 할 수 있습니까?
Emdadul Sawon

@EmdadulSawon 아마도 라이브러리 중 하나에 리소스로 포함시킬 수 있습니까?
알렉산더

27

참조 된 어셈블리를 포함 된 리소스로 포함하는 훌륭한 도구는 Costura ( Fody 추가 기능)입니다. 저자 Simon Kropp은 다음과 같이 설명합니다.

[...] 두 가지 방법의 조합 :

그 결과 단순히 Costura 를 가져 오기만 하면되는 매우 간단한 솔루션입니다. NuGet에서 .

풍모:

  • 디버그 기호 포함
  • 임베디드 어셈블리 압축
  • 특정 어셈블리 포함 / 제외
  • 기타 ( Readme 참조 )

9
OMG Costura.Fody가 정답입니다. nuget에서 패키지를 설치하고 프로젝트를 다시 빌드하면 이제 독립 실행 형 EXE가 있습니다.
Eric Labashosky

4
얼마나 쉬운 지 믿을 수 없습니다. 너겟에서 패키지를 설치하면 완료됩니다.
iraSenthil

2
Costura.Fody도 사용하고 있습니다. NuGet 패키지를 리소스로 포함하는 것은 간단하고 설치하기 쉽습니다. 프로젝트 가져 오기.
Michael Silver

1
@ user3700562,이 기술은 새 어셈블리를 생성하지 않고 하나 이상의 참조 된 어셈블리를 기존 어셈블리에 포함합니다.
CodeFox

1
훌륭한 솔루션! 1 년부터 사용했는데 문제가 없었습니다. 그러나 여기에는 최상위 프로젝트에서 참조하는 어셈블리 만 포함됩니다. 앱이 타사 어셈블리를 참조하는 다른 프로젝트를 참조하는 경우이를 최상위 프로젝트에 추가해야합니다.
Demir


3

WPF 종속성이있는 경우 옵션이 더 제한 될 수 있습니다 ..... ILMerge는 이러한 문제를 처리하지 않는 것 같습니다. Costura.Fody (위의 Codefox에서 언급했듯이)는 우리에게 완벽하게 작동했으며 시작하는 데 약 5 분이 걸렸습니다. 아주 좋은 경험이었습니다.

Nuget으로 설치합니다 (패키지 관리자 콘솔에서 올바른 기본 프로젝트 선택).

"Copy Local"= true로 표시된 모든 DLL을 병합하고 압축 된 병합 된 .EXE (표준 출력과 함께 현재 대부분이 필요하지 않음)를 생성합니다. 그런 다음 독립형으로 사용할 수 있습니다.

라이센스는 MIT이므로 필요에 따라 수정 / 배포 할 수 있습니다.

https://github.com/Fody/Costura/


2

체크 아웃 ServiceStack.Gap의 어느 하나의 크로스 플랫폼에 쇼 하우투 ILMerge ServiceStack의 몇 가지 예를 프로젝트 .EXE를 .

ServiceStack에는 다음과 같은 임베디드 앱을 만드는 데 특히 적합한 여러 다른 기능도 포함되어 있습니다.

  • .NET의 HTTP Listener를 사용하여 서비스를 자체 호스팅 할 수 있습니다.
  • 미리 컴파일 된 Razor 뷰 지원
  • 임베디드 리소스 지원
  • Sqlite 및 OrmLite에 포함 된 데이터베이스 지원
  • 단일 .exe로 ILMerged 가능

2

.net core 3은 프로젝트 구성에 단일 파일 게시 및 트리밍이라는 두 가지 새로운 옵션을 도입합니다.

여기 에서 문서에 대한 자세한 내용을 찾을 수 있으며 참조를 위해 여기 에 프로젝트 구성을 복사했습니다.

  1. 프로젝트 구성 :
    <PropertyGroup>
      <RuntimeIdentifier>win10-x64</RuntimeIdentifier>
      <PublishSingleFile>true</PublishSingleFile>
    </PropertyGroup>

    <PropertyGroup>
      <PublishTrimmed>true</PublishTrimmed>
    </PropertyGroup>
  1. CLI 사용 :
    dotnet publish -r win10-x64 -p:PublishSingleFile=true
    dotnet publish -r <rid> -c Release

두 옵션을 함께 결합하여 응용 프로그램에 맞게 잘린 단일 어셈블리를 얻을 수 있도록 완벽하게 지원됩니다.


2
이것은 당신이 단일 어셈블리임을 제공하지 않습니다. 단순히 파일을 zip 아카이브로 압축 한 다음 응용 프로그램을 실행하려고 할 때 사용자 폴더에 압축을 풉니 다.
Jesper
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.