Я провел некоторое время в связывании 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!");
}
}
}
Используйте код, приведенный выше, вставьте его в проект библиотеки классов и скомпилируйте его с .NET меньшим или равным 3.5.
Местоположение сгенерированной DLL должно быть известно сообществом lua. Вставьте его, например, в папку «клиффы» или другой известный путь системы 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: (Вариант 2 с "load_assembly")
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
Constructor 2
безымянный
Марс
Планета Земля моя родная планета. Его диаметр составляет около 12742 км. Наш сосед Марс
Я надеюсь, что это поможет некоторым из вас.
Edit 1: , кстати, способ вызова из Lua выглядит следующим образом:
PlanetObject1:testMethod()
PlanetObject2:testMethod()
Edit 2: Я нашел ведьма различных DLL, нужно обращаться по-разному. Одной из них нужна функция «импорт», а другая нужна «load_assembly» -функция. Держите это, возможно, в виду!
У меня были некоторые реальные проблемы, когда я использовал LuaInterface. Вы можете захотеть взглянуть на C# Compiling на лету. –
@Ruirize Спасибо за комментарий. Неужели эти «реальные проблемы» заставили вас отказаться от этого подхода в конце? Я посмотрю на C# Compiling «на лету». Надеюсь, это не сложно. – proudnoldo
В принципе, я не мог разоблачить свои классы C# для Lua без длительного обхода, что сделало полученный код Lua очень уродливым. (С тех пор я проиграл проект, это было давно). C# Compiling - это очень просто, и вы можете контролировать то, что открывается, используя модификаторы доступа. –