C# dll を lua にバインドするのに時間を費やしました。あなたの投稿は役に立ちましたが、何かが足りませんでした。次の解決策が機能するはずです。
(コンパイラを .NET Framework 3.5 以下に必ず変更してください!)
Planet.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: (CLRPackage からの「インポート」によるオプション 1)
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
名前のない
火星
地球は私の故郷です。その直径は約12742kmです。私たちの隣人は火星です
それがあなたの何人かを助けることを願っています。
編集 1:
ちなみに、lua からのメソッド呼び出しは次のようになります。
PlanetObject1:testMethod()
PlanetObject2:testMethod()
編集 2:
さまざまな dll を別の方法で処理する必要があることがわかりました。1 つは「インポート」機能が必要で、もう 1 つは「load_assembly」機能が必要でした。多分それを覚えておいてください!