C\#프로그램(여러 개의 Dll 포함)을 하나의 Exe 로 통합 하 는 간단 한 방법

4561 단어 C#dllexe
프로그램 을 개발 할 때 제3자 의 DLL 을 자주 인용 한 다음 에 생 성 된 exe 파일 을 컴 파일 하면 이러한 DLL 에서 독립 적 으로 실행 할 수 없다.
하지만 exe 하나만 있 으 면 완벽 하 게 작 동 할 수 있 는 작은 도 구 를 개발 하려 는 경우 가 많다.그럼 어 떡 하지?
다음은 코드 를 한 줄 쓰 지 않 아 도 쉽게 실현 할 수 있 는 아주 간단 한 방법 을 소개 한다.
여기 서 우 리 는Fody.Costura라 는 도 구 를 사용 해 야 한다.Fody.Costura 는Fody프레임 워 크 의 플러그 인 으로 Nuget 을 통 해 VS 프로젝트 에 설치 할 수 있 습 니 다.설치 후 프로젝트 에 의존 하 는 DLL(심지어 PDB)파일 을 모두 EXE 파일 에 포장 할 수 있 습 니 다.
사용 방법
  • VS 에서 Nuget 을 대상 으로 하 는 EXE 프로젝트 를 통 해 Costura.Fody 를 설치한다.또는 NuGet 콘 솔 을 통 해 명령 행 으로 설치:Install-Package Costura.Fody-Version 1.3.3
  • 프로젝트 재 구축.
  • 빌 드 가 완료 되면 프로젝트 의 출력 디 렉 터 리 에서 새로 생 성 된 EXE 파일 을 찾 으 면 출력 디 렉 터 리 에 DLL 이 존재 하 는 것 을 발견 할 수 있 습 니 다.하지만 걱정 마 세 요.이 EXE 는 이미 독립 적 으로 운행 할 수 있 습 니 다.이 DLL 들 을 모두 삭제 하고 EXE 를 실행 해 보 세 요.
    또한,Fody.Costura 는 다음 과 같은 진급 기능 도 지원 합 니 다.
  • 임시 프로그램 집합 파일:EXE 를 실행 하기 전에 자동 으로 DLL 을 EXE 에서 폴 더 시스템 으로 압축 해제 한 다음 일반적인 방식 으로 DLL 을 불 러 옵 니 다.
  • 위탁 관리 가 아 닌 DLL:Fody.Costura 를 합병 하면 위탁 관리 가 아 닌 DLL 을 합병 할 수 있 지만 자동 으로 합 쳐 지지 않 습 니 다.만약 프로그램 이 비 위탁 관리 DLL 과 관련 이 있다 면,Fody.Costura 의 설정 파일 을 수정 해서 어떤 비 위탁 관리 DLL 을 합병 하고 싶 은 지 표시 해 야 합 니 다.
  • DLL:Fody.Costura 를 미리 불 러 오 면 프로그램 이 시 작 될 때 일부 DLL 을 미리 불 러 올 수 있 습 니 다.DLL 의 불 러 오 는 순 서 를 지정 할 수도 있 습 니 다.
  • 이상 의 진급 기능 은 모두 Fody.Costura 의 설정 파일 을 수정 함으로써 이 루어 져 야 합 니 다.구체 적 인 작업 절 차 는 공식 문 서 를 참고 할 수 있 습 니 다.
    자,Fody.Costura 의 사용 방식 은 이미 소개 되 었 습 니 다.Fody.Costura 의 실현 원리 에 대해 궁금 하 다 면 계속 내 려 다 보 세 요.
    비 위탁 관리 DLL 통합
    
    <?xml version="1.0" encoding="utf-8"?>
    <Weavers>
     <Costura>
     <Unmanaged32Assemblies>
      SQLite.Interop
     </Unmanaged32Assemblies>
     <Unmanaged64Assemblies>
      SQLite.Interop
     </Unmanaged64Assemblies>
     </Costura>
    </Weavers>
    
    
    실현 원리 소개
    CLR 이 프로그램 집합 을 불 러 오 려 고 했 으 나 불 러 오 는 데 실 패 했 을 때 AppDomain.Assembly Resolve 사건 을 일 으 킬 수 있 습 니 다.우리 프로그램 은 이 사건 을 감청 할 수 있 으 며,이 사건 의 처리 함수 에서 이 CLR 이 불 러 오 려 는 프로그램 집합 을 되 돌려 프로그램 이 계속 정상적으로 실 행 될 수 있 도록 합 니 다.
    Fody.Costura 는 프로젝트 를 구축 할 때 EXE 가 참조 한 DLL 을 모두 EXE 파일 에 삽입 합 니 다.프로그램 이 실행 되 는 동안 DLL 을 사용 할 때(이때 CLR 에서 이 DLL 파일 을 찾 을 수 없어 서 AppDomain.Assembly Resolve 이벤트 가 실 행 됨)EXE 파일 의 끼 워 넣 은 자원 에서 필요 한 DLL 을 추출 합 니 다.
    다음 두 함 수 는 바로 Fody.Costura 가 이 부분의 논 리 를 실현 하 는 코드 입 니 다.
    
    public static void Attach()
    {
      var currentDomain = AppDomain.CurrentDomain;
      currentDomain.AssemblyResolve += (s, e) => ResolveAssembly(e.Name);
    }
    public static Assembly ResolveAssembly(string assemblyName)
    {
      if (nullCache.ContainsKey(assemblyName))
      {
       return null;
      }  
    
      var requestedAssemblyName = new AssemblyName(assemblyName);  
    
      var assembly = Common.ReadExistingAssembly(requestedAssemblyName);
      if (assembly != null)
      {
       return assembly;
      }  
    
      Common.Log("Loading assembly '{0}' into the AppDomain", requestedAssemblyName);  
    
      assembly = Common.ReadFromEmbeddedResources(assemblyNames, symbolNames, requestedAssemblyName);
      if (assembly == null)
      {
       nullCache.Add(assemblyName, true);  
    
       // Handles retargeted assemblies like PCL
       if (requestedAssemblyName.Flags == AssemblyNameFlags.Retargetable)
       {
         assembly = Assembly.Load(requestedAssemblyName);
       }
      }
      return assembly;
    }
    
    
    Attach 방법 이 AppDomain.assembly Resolve 사건 을 감청 한 것 을 볼 수 있다.CLR 이 프로그램 집합 을 성공 적 으로 불 러 올 수 없 을 때 Assembly Resolve 이벤트 처리 함수 가 실 행 됩 니 다.Assembly Resolve 는 Common.ReadFromEmbeddedresses 방법 을 통 해 불 러 온 프로그램 집합 에 포 함 된 자원 에서 대상 프로그램 집합 을 가 져 와 CLR 에 되 돌려 줍 니 다.
    여기 보면 Attach 방법 은 언제 실 행 됐 냐 고 물 어 볼 수도 있 습 니 다.
    사실은 이 렇 습 니 다.C\#언어 에 있어 서 CLR 은 하나의 큰 방법 을 숨 겼 습 니 다.CLR 은 모든 모듈(모든 프로그램 집합 에 하나 이상 의 모듈 이 포함 되 어 있 습 니 다)을 불 러 오기 전에 초기 화 된 코드 를 실행 할 수 있 습 니 다.하지만 안 타 깝 게 도 C\#언어 는 이 코드 를 제어 할 수 없습니다.Fody.Costura 는 내부 에서 IL 코드 를 EXE 프로그램 집합 내부 모듈 의 초기 화 함수 에 직접 주입 하 는데 이 부분의 IL 코드 는 사실 Attach 방법 을 실행 한 것 이다.이렇게 되면 EXE 프로그램 집합 이 불 러 오 면 Attach 방법 이 바로 호출 될 수 있 습 니 다.
    이상 은 Fody.Costura 실현 원리 에 대한 간단 한 소개 입 니 다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기