[WPF] 어셈블리를 exe파일에 합치기
2017. 5. 21. 02:43ㆍOthers/C# 일반
WPF프로그램을 빌드하면 관련된 어셈블리(dll)들이 exe파일과 같이 생성됩니다. 이 어셈블리 파일들을 exe파일과 같이 고객PC에 배포해야 프로그램이 정상적으로 동작합니다.
실행에 필요한 어셈블리를 배포하는 방법은 여러가지가 있지만, 여기서는 exe파일에 포함시키는 방법에 대해 소개합니다. 띠리사 exe파일만 배포해도 프로그램이 정상적으로 실행되게 됩니다.
- 먼저 모든 어셈블리를 프로젝트의 폴더에 포함시킵니다. 폴더명은 원하는 폴더명으로 하시면 됩니다.
- 위에서 포함한 모든 어셈블리의 Build Action을 Embedded Resources로 합니다.
- App Class로 이동해 다음과 같이 작성합니다.123456789101112131415161718192021222324252627282930313233
public
partial
class
App : Application
{
public
App()
{
AppDomain.CurrentDomain.AssemblyResolve +=
new
ResolveEventHandler(ResolveAssembly);
}
private
static
Assembly ResolveAssembly(
object
sender, ResolveEventArgs args)
{
//어셈블리가 .exe파일과 같은 폴더에 있으면 이 메서드는 호출되지 않습니다.
Assembly thisAssembly = Assembly.GetExecutingAssembly();
//1. 어셈블리 이름을 얻습니다.
AssemblyName assemblyName =
new
AssemblyName(args.Name);
string
name = args.Name.Substring(0, args.Name.IndexOf(
','
)) +
".dll"
;
//2. Embedded Resources로부터 리소스를 로드합니다.
var
resources = thisAssembly.GetManifestResourceNames().Where(s => s.EndsWith(name));
if
(resources.Any())
{
//거의 대부분의 확률로 항상 1개의 항목만 로드됩니다. 만약 1개이상 로드가되면 이러한 케이스를 별도로 처리해야 합니다.
var
resourceName = resources.First();
using
(Stream stream = thisAssembly.GetManifestResourceStream(resourceName))
{
if
(stream ==
null
)
return
null
;
var
block =
new
byte
[stream.Length];
stream.Read(block, 0, block.Length);
return
Assembly.Load(block);
}
}
return
null
;
}
}
- 이제 exe 파일만으로 실행되는지 테스트해봅니다.
참고사항
- 이 방법은 WinForm 개발방법에도 적용될 수 있습니다.
- 참고URL: https://www.bbsmax.com/A/1O5Ep8KbJ7/
'Others > C# 일반' 카테고리의 다른 글
[.NET] Framework Profiles in .NET (0) | 2016.03.30 |
---|---|
[C#] Portable Class Library (0) | 2016.03.29 |
[Office] 엑셀문서 접근 시 주의사항 (0) | 2015.07.17 |
[C#] Async, Await를 이용한 비동기 프로그래밍 (6) | 2014.03.26 |
[C#] N개의 공백을 하나의 공백으로 치환하기 (1) | 2013.12.27 |