说明:
我所有的函数都在 C# dll 项目中定义。然后我将 c# 函数包装在一个 cpp 库项目中,现在我想使用 c++ 编写一个 lua 模块并调用包装函数。
问题:
如何在 lua cpp 模块中调用包装函数?请给我一些建议,谢谢!
代码:
libutilscore 项目(C# DLL)
namespace libutilscore { public static class SharpFTP { public static string ShowHello() { return "Hello From C Sharp."; } } }
ManagedDll 项目(C++ DLL)
托管DLL.h
#pragma once #ifdef MANAGEDDLL_EXPORTS #define MANAGEDDLL_API __declspec(dllexport) #else #define MANAGEDDLL_API __declspec(dllimport) #endif MANAGEDDLL_API const char *CPP_ShowHello();
托管DLL.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 项目(Lua CPP 模块)
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; }