Описание:
Все мои функции определены в проекте C # dll. Затем я обертываю функции c # в проекте библиотеки cpp. Теперь я хочу написать модуль lua с использованием c ++ и вызвать функцию-обертку.
Вопрос:
Как вызвать функции-обертки в модуле lua cpp? Пожалуйста, дайте мне несколько предложений, спасибо!
коды:
Проект libutilscore (C # DLL)
namespace libutilscore
{
public static class SharpFTP
{
public static string ShowHello()
{
return "Hello From C Sharp.";
}
}
}
ManagedDll Project (C ++ DLL)
ManagedDll.h
#pragma once
#ifdef MANAGEDDLL_EXPORTS
#define MANAGEDDLL_API __declspec(dllexport)
#else
#define MANAGEDDLL_API __declspec(dllimport)
#endif
MANAGEDDLL_API const char *CPP_ShowHello();
ManagedDll.cpp
#include "ManagedDll.h"#include <string>
using namespace System;
using namespace std;
using namespace libutilscore;
namespace ManagedDll
{
public ref class CS_FTP
{
public:
static string CS_ShowHello()
{
String ^ message = libutilscore::SharpFTP::ShowHello();
string result = "";
MarshallString(message, result);
return result;
}
private:
static void MarshallString(String ^csstr, string &stdstr)
{
using namespace Runtime::InteropServices;
const char *chars = (const char*)(Marshal::StringToHGlobalAnsi(csstr)).ToPointer();
stdstr = chars;
Marshal::FreeHGlobal(IntPtr((void *)chars));
}
static void MarshallWstring(String ^csstr, string &wstr)
{
using namespace Runtime::InteropServices;
const char *wchars = (const wchar_t*)(Marshal::StringToHGlobalAnsi(csstr)).ToPointer();
wstr = wchars;
Marshal::FreeHGlobal(IntPtr((void *)wchars));
}
};
}
MANAGEDDLL_API string CPP_ShowHello()
{
return ManagedDll::CS_FTP::CS_ShowHello();
}
libutils.h
#pragma once
#ifdef LIBUTILS_EXPORTS
#define LIBUTILS_API __declspec(dllexport)
#else
#define LIBUTILD_API __declspec(dllimport)
#endif // LIBUTILS_EXPORTS
libutils.cpp
#include "libutils.h"#include "lua.hpp"
LIBUTILS_API int showHello(lua_State *luaEnv)
{
const char *msg = "";
// TODO Call DLL function
// msg = CPP_ShowHello().c_str();
lua_pushstring(luaEnv, msg);
return 1;
}
static const luaL_Reg libutils_funcs[] = {
{"showHello", showHello},
{"NULL", NULL}
};
LIBUTILS_API int luaopen_libutils(lua_State *luaEnv)
{
luaL_newlib(luaEnv, libutils_funcs);
return 1;
}
Одним из вариантов МОЖЕТ быть сделать ваш «Lua CPP Module» DLL-библиотекой смешанного режима. Я уже отвечал ранее на эту тему, поэтому прочитайте мои инструкции там, как это сделать: VC ++ Вызов функции проекта / clr из функции не / clr проекта в решении Короткий ответ заключается в том, что вы можете скомпилировать определенные части DLL, чтобы использовать CLR, не создавая всего этого, и затем вызывать их между собой.
По сути, как только вы выяснили, как вызывать DLL смешанного режима из кода PURE C ++, эта проблема очень похожа. Я не знаю об ограничениях для модулей LUA C ++, хотя я бы предположил, что если они могут загружать / вызывать другие библиотеки DLL, то все в порядке.
Для дополнительного удовольствия, затем выясните, как передавать информацию всю дорогу назад и вперед. И вызывая чистый C ++ из C # /. NET. Или обратные вызовы к / от каждого. Что получает действительно весело быстро.
Других решений пока нет …