어떻게 C\#에 Lua 스 크 립 트 를 통합 합 니까?

6726 단어 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 스 크 립 트 를 통합 하 는 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기