C\#프로그램(여러 개의 Dll 포함)을 하나의 Exe 로 통합 하 는 간단 한 방법
하지만 exe 하나만 있 으 면 완벽 하 게 작 동 할 수 있 는 작은 도 구 를 개발 하려 는 경우 가 많다.그럼 어 떡 하지?
다음은 코드 를 한 줄 쓰 지 않 아 도 쉽게 실현 할 수 있 는 아주 간단 한 방법 을 소개 한다.
여기 서 우 리 는Fody.Costura라 는 도 구 를 사용 해 야 한다.Fody.Costura 는Fody프레임 워 크 의 플러그 인 으로 Nuget 을 통 해 VS 프로젝트 에 설치 할 수 있 습 니 다.설치 후 프로젝트 에 의존 하 는 DLL(심지어 PDB)파일 을 모두 EXE 파일 에 포장 할 수 있 습 니 다.
사용 방법
또한,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 실현 원리 에 대한 간단 한 소개 입 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.