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

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

DLL

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

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

JsonServiceClient client = new JsonServiceClient(servicepath);

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



답변

몇 가지 옵션이 있습니다.

또는

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

또는

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


답변

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

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

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


답변

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

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

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

풍모:

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


답변

.NET 합병 인 ILMerge-GUI를 사용해보십시오 . Ilmerge모든 명령 줄 작업을 피하는 GUI 기반 입니다.


답변

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

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

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

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

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


답변

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

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

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


답변

.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

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