1

说明

我所有的函数都在 C# dll 项目中定义。然后我将 c# 函数包装在一个 cpp 库项目中,现在我想使用 c++ 编写一个 lua 模块并调用包装函数。

问题:

如何在 lua cpp 模块中调用包装函数?请给我一些建议,谢谢!

代码:

  1. libutilscore 项目(C# DLL)

     namespace libutilscore
     {
         public static class SharpFTP
         {
             public static string ShowHello()
             {
                 return "Hello From C Sharp.";
             }
         }
      }
    
  2. 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();
      }
      
      1. 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;
      }
      
4

1 回答 1

1

一种选择可能是使您的“Lua CPP 模块”成为混合模式 DLL。我之前已经回答过这个主题,所以请阅读我的说明,了解如何操作:VC++ Calling a function of /clr project from a function of non /clr project within a solution 简短的回答是您可以编译特定部分DLL 使用 CLR 而不用使整个事情那样,然后在它们之间调用。

基本上,一旦你弄清楚如何从 PURE C++ 代码调用混合模式 DLL,那么这个问题就非常相似了。我不知道对 LUA C++ 模块的限制,但我假设它们是否可以加载/调用其他 DLL,那么你就可以了。

为了获得额外的乐趣,然后弄清楚如何来回传递信息。并从 C#/.NET 调用纯 C++。或回调到/从每个。这很快就会变得非常有趣。

于 2018-05-11T14:25:47.037 回答