2024.11.21 - [분류 전체보기] - 유니티 - 디버깅을 해보자 (feat : 유니티 Debug, IDE 중단점 활용 법)
오늘은 DLL에 대해 알아보고자 합니다.
이전에 디버깅 글을 작성하면서 DLL에 관한 내용이 나오길래
호기심에 찾아 정리해 봤습니다.
DLL( Dynamic Link Library )?
Library - 컴퓨터 프로그램이 사용하는 비휘발성 자원(함수, 데이터, 타입 )의 모임
DLL은 동적 링크 라이브러리로,
여러 프로그램에서 동시에 사용할 수 있는 코드와 데이터를 포함하는 라이브러리
- MSDN(MicroSoft Developer Network) 문서 참고
DLL을 사용하면 뭐가 좋을까?
1)
일반 lib파일과 달리 메모리 관점에서 이점이 생긴다.
=>여러 프로그램이 동시에 같은 DLL을 사용할 때, 메모리에 한 번만 로드됨
=>동적으로 프로그램에 연결하므로 프로그램 시작 시 모든 코드를 로드할 필요가 없음
= 실제 사용되는 기능만 메모리 로드 = 최적화
2)
외부에서 컴파일된 DLL을 가져와(동적 로드) 사용함으로써 코드 노출을 줄일 수 있다.
유니티에선 DLL이 어떻게 사용되고 있을까?
유니티 프로젝트 폴더를 보면 Library 폴더가 존재하는 걸 확인 할 수 있습니다.
보시는 바와 같이 각 DLL 파일에 대응하는 PDB 파일이 페어로 존재합니다.
PDB(Program Database)?
Microsoft Visual Studio에서 생성되는 디버깅 정보를 담고 있는 파일입니다.
유니티에서 작성하는 코드는 별다른 설정을 안했다면
기본적으로 Assembly-CSharp.dll로 변환이 되고
실행될 때마다 유니티와 연결되었다가 꺼지는 과정을 반복해 겪는다고 합니다.
(이게 우리가 빌드를 할 때 컴파일 과정에서 일어나는 중이었습니다. 오... )
Assembly definition
프로젝트 규모가 커질수록 Assembly-Csharp.dll로 변환하는 시간도 오래 걸릴 겁니다.
이를 해결하고자 Assembly.Csharp.dll에서 때어내 따로 DLL을 만들어 관리하는 기법입니다.
만드는 방법은 간단합니다.
우클릭 후 Assembly Definition을 클릭하면 DLL 파일을 생성할 수 있습니다.
이때 보통 DLL 파일명을 DLL이 위치한 폴더 명으로 진행하는 듯 합니다.
유니티에서 만들어지는 DLL 말고 직접 만든 DLL을 추가해 사용할 수는 없을까?
여러 방법이 있습니다만
그중 플러그인 폴더에 DLL을 넣고 Using을 통해
원하는 스크립트에서 불러와 사용하는 방식을 권장하는 듯 합니다.
코드 예시
using System;
using UnityEngine;
namespace DLLTest {
public class MyUtilities {
public int c;
public void AddValues(int a, int b) {
c = a + b;
}
public static int GenerateRandom(int min, int max) {
System.Random rand = new System.Random();
return rand.Next(min, max);
}
}
}
using UnityEngine;
using System.Collections;
using DLLTest;
public class Test : MonoBehaviour {
void Start () {
MyUtilities utils = new MyUtilities();
utils.AddValues(2, 3);
print("2 + 3 = " + utils.c);
}
void Update () {
print(MyUtilities.GenerateRandom(0, 100));
}
}
더 자세한 사항은 아래 참고한 자료를 직접 참고해보시면 좋을 것 같습니다.
마무리
오늘은 간단하게 DLL에 대해 알아보았습니다.
DLL의 이름은 자주 들어봤는데 ( ".dll이 없습니다"가 뜨는 오류로.. ㅋ)
이렇게 정리해 본 건 처음이었네요.
지금 보니 너무 디버깅의 연장선이 된 거 같기도 하네요.;;
추가로 자료를 찾다 보니까 배포하는 과정에서 해커로부터 보호하기 위해
dll을 만들고 암호화하기도 하는 것 같던데
이 부분은 나중에 실력이 충분히 성장하고 나서 한번 자세히 다뤄보도록 하겠습니다.
참고한 자료
https://docs.unity3d.com/kr/2023.2/Manual/UsingDLL.html
관리되는 플러그인 - Unity 매뉴얼
관리되는 플러그인은 Visual Studio와 같은 툴로 Unity 외부에서 생성하여 DLL(Dynamically Linked Library)로 컴파일하는 .NET 어셈블리입니다.
docs.unity3d.com
https://docs.unity3d.com/kr/2023.2/Manual/ScriptCompilationAssemblyDefinitionFiles.html
어셈블리 정의 - Unity 매뉴얼
어셈블리 정의 및 어셈블리 레퍼런스는 스크립트를 어셈블리로 구성할 수 있는 에셋입니다.
docs.unity3d.com
\
https://youtu.be/vWCf3YyQ_s0?si=K5QCT3VRAKhYLHyi