我花了一些时间将 C# dll 绑定到 lua。您的帖子很有帮助,但缺少一些东西。以下解决方案应该有效:
(确保将编译器更改为 .NET Framework 3.5 或更低版本!)
行星.dll:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Planets
{
public class Planet
{
private string name;
public string Name
{
get { return name; }
set { this.name = value; }
}
private float diameter;
public float Diameter
{
get { return diameter; }
set { this.diameter = value; }
}
private int cntContinents;
public int CntContinents
{
get { return cntContinents; }
set { this.cntContinents = value; }
}
public Planet()
{
Console.WriteLine("Constructor 1");
this.name = "nameless";
this.diameter = 0;
this.cntContinents = 0;
}
public Planet(string n, float d, int k)
{
Console.WriteLine("Constructor 2");
this.name = n;
this.diameter = d;
this.cntContinents = k;
}
public void testMethod()
{
Console.WriteLine("This is a Test!");
}
}
}
使用上面的代码,将其粘贴到您的类库项目中,并使用小于或等于 3.5 的 .NET 进行编译。
生成的 DLL 的位置需要 lua 环境知道。将其粘贴到例如“clibs”文件夹或另一个众所周知的 lua 系统路径中。然后尝试使用下面的 lua 示例。它应该工作。
Test1.lua:(选项 1,从 CLRPackage 中“导入”)
require "luanet"
require "CLRPackage"
import "Planet"
local PlanetClass = luanet.import_type("Planets.Planet")
print(PlanetClass)
local PlanetObject1 = PlanetClass()
print(PlanetObject1)
local PlanetObject2 = PlanetClass("Earth",6371.00*2,7)
print(PlanetObject1.Name)
PlanetObject1.Name = 'Mars'
print(PlanetObject1.Name)
print( "Planet " ..
PlanetObject2.Name ..
" is my home planet. Its diameter is round about " ..
PlanetObject2.Diameter .. "km." ..
" Our neighour is " ..
PlanetObject1.Name)
Test2.lua:(带有“load_assembly”的选项2)
require "luanet"
require "CLRPackage"
luanet.load_assembly("Planet")
local PlanetClass = luanet.import_type("Planets.Planet")
print(PlanetClass)
local PlanetObject1 = PlanetClass()
print(PlanetObject1)
local PlanetObject2 = PlanetClass("Earth",6371.00*2,7)
print(PlanetObject1.Name)
PlanetObject1.Name = 'Mars'
print(PlanetObject1.Name)
print( "Planet " ..
PlanetObject2.Name ..
" is my home planet. Its diameter is round about " ..
PlanetObject2.Diameter .. "km." ..
" Our neighour is " ..
PlanetObject1.Name)
在这两种情况下,控制台输出都将如下所示:
ProxyType(Planets.Planet): 18643596
构造函数 1
Planets.Planet: 33574638
构造函数 2
无名
火星
行星地球是我的家乡星球。它的直径约为12742公里。我们的邻居是火星
我希望它对你们中的一些人有所帮助。
编辑 1:
顺便说一下,来自 lua 的方法调用如下所示:
PlanetObject1:testMethod()
PlanetObject2:testMethod()
编辑 2:
我发现不同的 dll 需要以不同的方式处理。一个需要“import”功能,另一个需要“load_assembly”功能。请记住这一点!