Как вызвать управляемые функции dll c ++ в модуле lua cpp - PullRequest
0 голосов
/ 11 мая 2018

Описание :

Все мои функции определены в проекте C # dll. Затем я обертываю функции c # в проекте библиотеки cpp. Теперь я хочу написать модуль lua с использованием c ++ и вызвать функцию-обертку.

Вопрос:

Как вызвать функции-оболочки в модуле 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)

    • 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();
      }
      
      1. Проект libutils (Lua CPP Module)
    • 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;
      }
      

1 Ответ

0 голосов
/ 11 мая 2018

Один из вариантов МОЖЕТ сделать ваш модуль Lua CPP модулем DLL смешанного режима.Ранее я уже отвечал на эту тему, поэтому прочтите там мои инструкции о том, как это сделать: VC ++ Вызов функции проекта / clr из функции не / clr проекта в решении Короткий ответ заключается в том, что выможет скомпилировать определенные части DLL, чтобы использовать CLR, не создавая всего этого, и затем вызывать их между собой.

По сути, как только вы выяснили, как вызывать DLL смешанного режима из PURE C ++код, то эта проблема очень похожа.Я не знаю об ограничениях для модулей LUA C ++, хотя я бы предположил, что если они могут загружать / вызывать другие библиотеки DLL, то все в порядке.

Для дополнительного удовольствия, а затем выясните, как передавать информацию всемпуть туда и обратно.И вызывая чистый C ++ из C # /. NET.Или обратные вызовы к / от каждого.Это действительно весело быстро.

...