개발자-H 입니다.

Lua 활용하여 C# 플러그인 API 제공하기. 본문

.NET

Lua 활용하여 C# 플러그인 API 제공하기.

개발자-H 2021. 7. 11. 16:25

Lua 스크립트 엔진을 활용하여 특정 언어의 API 호출이나, 메모리 참조가 가능하다.

이를 이용하여 플러그인 같은 외부 API 제공이 가능하다.

 

이번 포스팅에서는 NLua와 C#을 활용하여 라벨을 변경 API 만들어보자.

 

 

1. 설치

  • Nuget Package 관리 - NLua 검색 - 설치

 

2. UI 구성 및 API 기능 

  • 실행 클릭 - 루아 스크립트 실행
  • Label 배경 색상 변경
  • Label Text 변경

3. Code

3.1 API 제공 Class 정의

    public class LabelAPI
    {
        //루아 스크립트로 조작 할 Label Control
        private Label label;

        //루아 - 프로퍼티 접근 
        public string Text 
        {
            get => label.Text;
            set
            {
                label.Text = value;
            }
        }

        public LabelAPI(Label labelControl)
        {
            this.label = labelControl;
            this.label.Text = Text;
        }

        //루아 - Method 접근
        public void SetColor(byte r, byte g, byte b)
        {
            this.label.BackColor = Color.FromArgb(r, g, b);
        }
    }

 

3.2 "실행" 클릭 시 발생하는 코드 부분

        /// <summary>
        /// 실행 버튼 클릭 이벤트 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void RunLuaScript_Click(object sender, EventArgs e)
        {
            try
            {
                //루아 스크립트 엔진 선언
                using (Lua lua = new Lua())
                {
                    //Label API 객체 등록
                    lua["LabelAPI"] = new LabelAPI(luaResultLabel);

                    //인코딩 문자열 방식 지정
                    lua.State.Encoding = Encoding.UTF8;

                    //Lua Script Text -> 스크립트 실행
                    lua.DoString(luaSrciptTextBox.Text);
                }
            }
            catch (Exception err)
            {
                MessageBox.Show($"{err}");
            }
        }

 

3.3 API 기능 별 Test Code

    [TestClass]
    public class LuaAPITests
    {
        [TestMethod]
        public void 루아_DoStringTest()
        {
            //루아 스크립트 엔진
            using (Lua lua = new Lua())
            {
                lua.State.Encoding = Encoding.UTF8; //입력 문자열 인코딩 방식. 지정하지 않을 경우 문자 꺠짐 발생함
                lua.DoString("res = '루아 프로젝트'");
                string res = (string)lua["res"];

                Assert.AreEqual("루아 프로젝트", res);
            }
        }

        [TestMethod]
        public void 루아_API_Setter프로퍼티_Label_Text_변경()
        {
            Label label = new Label();
            LabelAPI api = new LabelAPI(label);

            //루아 스크립트 엔진
            using (Lua lua = new Lua())
            {
                lua["LabelAPI"] = api;
                lua.State.Encoding = Encoding.UTF8; //입력 문자열 인코딩 방식. 지정하지 않을 경우 문자 꺠짐 발생함
                lua.DoString(@"
                    LabelAPI.Text = 'hello'
                ");

                Assert.AreEqual("hello", label.Text);
            }
        }

        [TestMethod]
        public void 루아_API_Getter프로퍼티_Label_Text_가져오기()
        {
            Label label = new Label();
            LabelAPI api = new LabelAPI(label);

            //루아 스크립트 엔진
            using (Lua lua = new Lua())
            {
                lua["LabelAPI"] = api;
                lua.State.Encoding = Encoding.UTF8; //입력 문자열 인코딩 방식. 지정하지 않을 경우 문자 꺠짐 발생함
                lua.DoString(@"
                    LabelAPI.Text = 'hello'
                    local labelText = LabelAPI.Text
                ");

                string res = (string)lua["labelText"];

                Assert.AreEqual("hello", label.Text);
            }
        }

        [TestMethod]
        public void 루아_API_Label_BackColor_변경()
        {
            Label label = new Label();
            LabelAPI api = new LabelAPI(label);

            //루아 스크립트 엔진
            using (Lua lua = new Lua())
            {
                lua["LabelAPI"] = api;
                lua.State.Encoding = Encoding.UTF8; //입력 문자열 인코딩 방식. 지정하지 않을 경우 문자 꺠짐 발생함
                lua.DoString(@"
                    LabelAPI:SetColor(255, 0, 0)
                ");

                Assert.AreEqual(255, label.BackColor.R);
                Assert.AreEqual(0, label.BackColor.G);
                Assert.AreEqual(0, label.BackColor.B);
            }
        }
    }

 

4. Reference

https://github.com/NLua/NLua

 

NLua/NLua

Bridge between Lua and the .NET. Contribute to NLua/NLua development by creating an account on GitHub.

github.com

 

'.NET' 카테고리의 다른 글

NetworkInterface를 이용하여 특정 NIC IPv4 주소 찾기  (0) 2021.01.14
Comments