유니티/공통

DLL( Dynamic Link Library)에 대해 알아보자 (feat : PDB(Program Database), Assembly definition)

근본넘치는개발자 2024. 11. 26. 23:59

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