어떻게 C\#에 Lua 스 크 립 트 를 통합 합 니까?
많은 경우 에 우리 코드 의 일부 논리 적 조작 은 코드 에 하 드 코딩 되 지 않 습 니 다.우 리 는 설정 을 통 해 이 조작 을 완성 하고 싶 을 수도 있 습 니 다.그래서 이 럴 때 우 리 는 스 크 립 트 언어 가 이러한 조작 을 처리 할 수 있어 야 합 니 다.C\#언어 에서 흔히 볼 수 있 는 것 은 NLua 라 는 동적 라 이브 러 리 를 도입 하여 lua 스 크 립 트 언어 를 도입 하여 유연 하 게 설정 하 는 목적 을 달성 하 는 것 이다.이 글 은 주로 구체 적 인 사례 를 통 해 C\#에서 NLua 를 도입 하고 설정 한 스 크 립 트 를 어떻게 호출 하 는 지 설명 한다.
순서
1 NLua.dll 도입
이 dll 은 매우 가 벼 운 라 이브 러 리 입 니 다.100 kb 정도 입 니 다.이 라 이브 러 리 를 참조 하면 Nuget 패키지 관리 자 를 통 해 참조 할 수 있 습 니 다.현재 인 용 된 버 전 은 1.5.7.0 입 니 다.인 용 된 후에 어떤 DLL 이 추가 되 었 는 지 살 펴 보 겠 습 니 다.
이 안 에는 lua54.dll 에 x86 과 x64 두 가지 유형의 버 전이 있 습 니 다.이 버 전 은 사용 할 때 주의해 야 합 니 다.설정 이 Any CPU 를 선 택 했 기 때문에 두 가지 버 전의 dll 이 있 습 니 다.여기 서 사용 할 때 주의해 야 합 니 다.
2.구체 적 인 용법
다음은 콘 솔 프로그램 을 통 해 이 스 크 립 트 를 어떻게 사용 해 야 하 는 지 살 펴 보 겠 습 니 다.표현 식 을 직접 만 들 고 등록 방법 을 사용 하 며 lua 를 사용 하여 C\#함수 와 C\#라 이브 러 리 를 직접 가 져 온 다음 에 내부 방법 을 호출 하 는 세 가지 측면 에서 설명 합 니 다.
2.1 직접 표현 식 만 들 기
콘 솔 프로그램의 코드 를 직접 보 겠 습 니 다.
class Program
{
static void Main(string[] args)
{
using (var state = new Lua())
{
//Evaluating simple expressions:
//Lua can return multiple values, for this reason DoString return a array of objects
var res0 = state.DoString("return 10 + 3*(5 + 2)")[0];
Console.WriteLine($"Output result0:{res0}");
//Passing raw values to the state:
double val = 12.0;
state["x"] = val; // Create a global value 'x'
var res1 = (double)state.DoString("return 10 + x*(5 + 2)")[0];
Console.WriteLine($"Output result1:{res1}");
//Retrieving global values:
state.DoString("y = 10 + x*(5 + 2)");
double y = (double)state["y"]; // Retrieve the value of y
Console.WriteLine($"Y result:{y}");
Console.ReadKey();
}
}}
주의사항:
먼저 이 설명 을 보십시오:Lua can return multiple values,for this reason DoString return a array of objects,즉 DoString 방법 을 직접 호출 할 때 되 돌아 오 는 결 과 는 object[]형식 이기 때문에 결 과 를 가 져 올 때 첫 번 째 를 사용 해 야 합 니 다.
2.2 등록 Lua Function
여기 서 우 리 는 DoString 에서 function 을 직접 정의 한 다음 에 Call 방법 을 통 해 호출 합 니 다.다음 예제 와 결 과 를 다시 보 겠 습 니 다.
class Program
{
static void Main(string[] args)
{
using (var state = new Lua())
{
//Retrieving Lua functions:
state.DoString(@"function ScriptFunc (val1, val2)
if val1 > val2 then
return val1 + 1
else
return val2 - 1
end
end
");
var scriptFunc = state["ScriptFunc"] as LuaFunction;
var funcRes = scriptFunc.Call(3, 5).First();
Console.WriteLine($"Func result:{funcRes}");
Console.ReadKey();
}
}
}
마찬가지 로 저희 도 최종 집행 결 과 를 보도 록 하 겠 습 니 다.2.3 Lua 호출 C\#함수
아래 의 예 는 호출 의 전체 과정 을 보 여 주 는 몇 가지 서로 다른 매개 변수 유형 과 반환 유형 을 포함한다.
using System;
using System.Linq;
using NLua;
namespace NLuaConsoleApp
{
class Program
{
static void Main(string[] args)
{
using (var state = new Lua())
{
////---------------------------------------------------lua c#
TestClass obj = new TestClass();
// CLR Lua, Lua typeof(TestClass).GetMethod("TestPrint")
state.RegisterFunction("TestPrint", obj, obj.GetType().GetMethod("TestPrint"));
// CLR Lua, Lua typeof(TestClass).GetMethod("AnotherFunc")
state.RegisterFunction("AnotherFunc", obj, obj.GetType().GetMethod("AnotherFunc"));
// CLR Lua, Lua
state.RegisterFunction("TestStaticPrint", null, typeof(TestClass).GetMethod("TestStaticPrint"));
state.DoString("TestPrint(10,20)");
state.DoString("AnotherFunc('10','20')");
state.DoString("TestStaticPrint()");
Console.ReadKey();
}
}
class TestClass
{
public int TestPrint(int num,int num2)
{
var result = num + num2;
Console.WriteLine("Print result:" + result);
return result;
}
public void AnotherFunc(string val1, string val2)
{
Console.WriteLine($"MyTest,Param1:{val1},Param2:{val2}");
}
public static void TestStaticPrint()
{
Console.WriteLine("TestStaticPrint");
}
}
}
}
마찬가지 로 우 리 는 전체 테스트 의 완전한 결 과 를 되 돌려 보 았 다.2.4 Import 를 통 해 네 임 스페이스 참조 C\#함수 가 져 오기
이것 은공식 적 인 예에 따라 시 뮬 레이 션 을 진행 하 였 으 나,호출 할 때 항상 오 류 를 보고 하 였 으 며,현재 구체 적 인 예 시 를 붙 여 뒤에 조사 하여 사용 하도록 제공 하 였 다.
class Program
{
static void Main(string[] args)
{
using (var state = new Lua())
{
state.LoadCLRPackage();
state.DoString(@" import ('System.Web') ");
state.DoString(@" client = WebClient() ");
state.DoString(@"local res = client:DownloadString('http://nlua.org')");
Console.ReadKey();
}
}
}
이것 은 C\#프로그램 집합 을 호출 하고 네 임 스페이스 를 도입 한 다음 에 그 내부 의 WebClient 방법 을 호출 하 는 것 입 니 다.이것 은 디 버 깅 할 때 항상 오 류 를 보 고 했 습 니 다.이 일시 적 기록 은 나중에 오 류 를 조사 할 수 있 습 니 다.3 총화
Lua 대상 이 IDispose 인 터 페 이 스 를 실 현 했 기 때문에 사용 할 때 using 방식 을 사용 하거나 사용 후 Dispose 방법 을 사용 하여 자원 을 방출 하 는 것 에 주의해 야 합 니 다.또한 C\#에서 Lua 스 크 립 트 를 도입 하 는 흔 한 것 은 일부 호출 과정 이 코드 에 하 드 인 코딩 되 지 않 고 설정 에 적합 하 다 는 것 이다.서로 다른 Lua 스 크 립 트 를 설정 하여 프로그램 을 맞 춤 형 으로 조작 하 는 것 은 기 존 코드 에 대한 좋 은 보충 이다.또한 C\#에서 dll 을 사용 하 는 방법 에 문제 가 발생 하 는 것 은 연구 중 이 며 나중에 이 과정 을 업데이트 하 는 것 을 발견 했다.
이상 은 C\#에 Lua 스 크 립 트 를 어떻게 통합 하 는 지 에 대한 상세 한 내용 입 니 다.C\#에 Lua 스 크 립 트 를 통합 하 는 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.