Как вызвать управляемые функции dll c ++ в модуле lua cpp

Описание:

Все мои функции определены в проекте 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 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();
      }
      
      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;
      }
      

1

Решение

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

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]