Обертывание C ++ для использования в C #

Хорошо, в основном есть большой проект C ++ (Recast) , который я хочу обернуть, чтобы использовать его в своем проекте C #.

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

Однако есть масса структур и перечислений, которые мне также понадобятся в моем проекте C #. Итак, как мне их обернуть?

Основной метод, который я использую сейчас, - это добавление вызовов dllexport в собственный код C ++, компиляция в dll / lib, добавление этой библиотеки в мой проект C ++ / CLI и импорт заголовков C ++, затем компиляция проекта CLI в dll, наконец, добавление этой dll в качестве ссылки на мой проект C #. Я ценю любую помощь.

Вот код .. Мне нужен управляемый способ сделать это, поскольку проект C ++ очень велик.

//**Native unmanaged C++ code
//**Recast.h

enum rcTimerLabel
{
   A,
   B,
   C
};

extern "C" {

class __declspec(dllexport) rcContext
{
   public:
   inline rcContect(bool state);
   virtual ~rcContect() {}
   inline void resetLog() { if(m_logEnabled) doResetLog(); }

   protected:
   bool m_logEnabled;
}

struct rcConfig
{
   int width;
   int height;
}

} // end of extern


// **Managed CLI code
// **MyWrappers.h
#include "Recast.h"

namespace Wrappers
{
   public ref class MyWrapper
   {
   private:
     rcContect* _NativeClass;
   public:
     MyWrapper(bool state);
     ~MyWrapper();
     void resetLog();
     void enableLog(bool state) {_NativeClass->enableLog(state); }
   };
}

//**MyWrapper.cpp
#include "MyWrappers.h"

namespace Wrappers
{
   MyWrapper::MyWrapper(bool state)
   {
      _NativeClass = new rcContext(state);
   }

   MyWrapper::~MyWrapper()
   {
      delete _NativeClass;
   }
   void MyWrapper::resetLog()       
   {
      _NativeClass->resetLog();
   }
}


// **C# code
// **Program.cs

namespace recast_cs_test
{
   public class Program
   {
      static void Main()
      {
          MyWrapper myWrapperTest = new MyWrapper(true);
          myWrapperTest.resetLog();
          myWrapperTest.enableLog(true);
      }
   }
}

8
задан Serj-Tm 7 March 2012 в 01:36
поделиться