[로봇활용_12주차] C# DLR(Dynamic Language Runtime)

최윤호·2025년 11월 1일
post-thumbnail

C#에서 파이썬 코드를 돌린다고?

만약 C#의 정적 타입 세상 안에서 파이썬(Python)이나 루비(Ruby)처럼
유연한 동적 타입 언어(Dynamic Typed Language)의 코드를 실행할 수 있다면 어떨까요?
C#에는 이를 가능하게 하는 비밀 병기, DLR(Dynamic Language Runtime)이 있습니다.

1)DLR이란?

DLR(Dynamic Language Runtime)은 .NET 프레임워크 위에 구축된 일종의 실행 환경입니다.
DLR의 핵심 역할은 C# 같은 정적 언어의 세계와 파이썬 같은 동적 언어의 세계를
서로 이해하고 소통할 수 있도록 만들어주는 '만능 번역기'이자 '다리'입니다.
DLR이 수행하는 역할은 다음과 같습니다.

  • 동적 메서드 호출(Dynamic Dispatch): dynamic변수가 어떤 메서드를 호출할 때,
    컴파일 시점이 아닌 런타임(Runtime)에 그 메서드가 존재하는지 찾아서 연결해 줍니다.

  • 식 트리(Expression Tree): 코드를 데이터 구조처럼 다루어 런타임에 분석하고,
    수정하고, 실행할 수 있게 해줍니다. DLR은 이 기술을 사용해
    동적 언어의 코드를 이해하고 .NET 환경에 맞게 변환합니다.

  • 호출 사이트 캐싱(Call Site Caching): 동적 호출은 정적 호출보다 느릴 수밖에 없습니다.
    DLR은 한 번 성공한 호출 정보를 캐싱(저장)해 두었다가,
    다음번에 동일한 호출이 발생하면 이 캐시를 사용해 성능을 크게 향상합니다.
    처음엔 길을 찾아 헤매지만, 두 번째부턴 기억해 둔 지름길로 가는 것과 같죠!

dynamic키워드는 DLR의 맛보기 버전!
우리가 이전에 살펴본 dynamic키워드는 사실 DLR의 강력한 기능을
C#에서 쉽게 사용할 수 있도록 제공되는 '사용자 인터페이스'와 같습니다.
dynamic을 사용하면 컴파일러는 DLR을 활용하는 코드를 자동으로 생성해 줍니다.

2)준비물: IronPython 설치

먼저 IronPython이라는 라이브러리가 필요합니다.
IronPython은 .NET 환경에서 파이썬을 실행할 수 있게 해주는 구현체입니다.
Visual Studio의 NuGet 패키지 관리자에서 IronPython을 검색하여 설치해 주세요.

[페키지 관리자 콘솔 창에서 명령어 입력시]

PM> Install-Package IronPython

3)C#에서 파이썬 코드 실행

이제 C# 코드 안에서 간단한 파이썬 함수를 작성하고 실행해 보겠습니다.

[코드]

using IronPython.Hosting; // IronPython 사용을 위한 네임스페이스
using Microsoft.Scripting.Hosting; // DLR 핵심 네임스페이스
using System;

class Program
{
    static void Main()
    {
        // 1. 파이썬 코드를 실행할 DLR 엔진을 생성합니다.
        ScriptEngine engine = Python.CreateEngine();

        // 2. 파이썬 변수들이 저장될 공간(Scope)을 만듭니다.
        ScriptScope scope = engine.CreateScope();

        // 3. 실행할 파이썬 코드를 C# 문자열로 작성합니다.
        // @ 기호를 사용하면 컴파일러는 문자열 내부의 내용을 있는 그대로 해석합니다.
        string pythonCode = @"
def add_numbers(a, b):
    print(f'파이썬 함수가 호출되었습니다: a={a}, b={b}')
    return a + b
";

        // 4. DLR 엔진이 파이썬 코드를 실행하고, scope에 'add_numbers' 함수를 정의합니다.
        engine.Execute(pythonCode, scope);

        // 5. scope에 정의된 파이썬 함수를 'dynamic' 타입으로 가져옵니다.
        //    이것이 바로 DLR이 C#과 파이썬을 연결하는 순간입니다!
        dynamic addFunction = scope.GetVariable("add_numbers");

        // 6. C# 코드에서 파이썬 함수를 직접 호출합니다!
        var result = addFunction(10, 20);

        // 7. 결과 출력
        Console.WriteLine($"C#에서 받은 결과: {result}");
    }
}

[실행 결과]

파이썬 함수가 호출되었습니다: a=10, b=20
C#에서 받은 결과: 30

정말 신기하지 않나요? C# 코드에서 addFunction(10, 20)을 호출했을 뿐인데,
IronPython 엔진을 통해 실제 파이썬 함수를 실행하고 그 결과를 C#으로 돌려주었습니다.
dynamic키워드가 이 과정에서 파이썬 함수를 담는 그릇 역할을 훌륭하게 해냈죠.

4)DLR 요약

C#의 정적인 틀을 깨는 강력한 엔진, DLR에 대해 알아보았습니다.
정적 타입이 주는 안정성과 성능의 이점을 포기해야 하므로
C#에서 DLR을 함부로 남용하는 것은 좋지 않습니다.
하지만 특정 시나리오에서 DLR은 분명 강력한 해결책이 될 수 있습니다.

  • DLR은 C#이 파이썬 같은 동적 언어와 소통할 수 있게 해주는 '다리'입니다.
  • dynamic키워드는 DLR의 기능을 쉽게 쓰기 위한 문법적 설탕입니다.
  • IronPython 같은 라이브러리를 사용하면, C# 애플리케이션 내에서
    다른 스크립트 언어의 코드를 직접 실행하는 강력한 기능을 구현할 수 있습니다.
profile
🚀 미래의 엔지니어를 꿈꾸는 훈련생의 기록 📝

0개의 댓글