Notice
Recent Posts
Recent Comments
Link
개발자-H 입니다.
Lua 활용하여 C# 플러그인 API 제공하기. 본문
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
'.NET' 카테고리의 다른 글
NetworkInterface를 이용하여 특정 NIC IPv4 주소 찾기 (0) | 2021.01.14 |
---|
Comments