c#からc++抽象クラスのtypedef enumを引数にもつc++/CLIメソッドを使用したいのですが、c#側でどのように引数を設定すればよいかが分からなかったためご教示お願いいたします。
Form1.cs(c#)
1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10using Wrapper; 11 12namespace UrgLibraryTestTool 13{ 14 public partial class Form1 : Form 15 { 16 17 public Form1() 18 { 19 InitializeComponent(); 20 21 } 22 23 //WrapperClassのインスタンスを作成 24 WrapperClass wr = new WrapperClass(); 25 26 private void button_connect_Click(object sender, EventArgs e) 27 { 28 //WrapperClassのopen()を呼ぶ 29 if (wr.open(textBox_IP.Text, 10940, ここの引数をどのように設定するかが分からない)) 30 { 31 //処理 32 33 } 34 } 35 36 } 37 38}
WrapperClass.cpp
1#include "pch.h" 2 3#include "WrapperClass.h" 4 5using namespace System; 6using namespace System::Runtime::InteropServices; 7 8Wrapper::WrapperClass::WrapperClass() 9{ 10 _urglib = new qrk::UrgLib(); 11} 12 13Wrapper::WrapperClass::~WrapperClass() 14{ 15 delete _urglib; _urglib = nullptr; 16} 17 18Wrapper::WrapperClass::!WrapperClass() 19{ 20 this->~WrapperClass(); 21} 22 23 24bool Wrapper::WrapperClass::open(System::String^ device_name, long baudrate, qrk::UrgLib::connection_type_t type) 25{ 26 msclr::interop::marshal_context o_device_name; 27 28 const char* p_device_name = o_device_name.marshal_as<const char*>(device_name); 29 30 return _urglib->open(p_device_name, baudrate, type); 31}
UrgLib.h
1#ifdef URGLIB_EXPORTS 2#define URGLIB_API __declspec(dllexport) 3#else 4#define URGLIB_API __declspec(dllimport) 5#endif 6 7#include <memory> 8#include <string> 9 10#include <vector> 11#include <cstddef> 12#include "Lidar.h" 13 14namespace qrk 15{ 16 class URGLIB_API UrgLib : public Lidar 17 { 18 public: 19 20bool open(const char* device_name, long baudrate = Default_baudrate, 21 connection_type_t type = Serial); 22 23 }; 24}
UrgLib.cpp
1#include "pch.h" 2#include "UrgLib.h" 3 4#include "ticks.h" 5extern "C" { 6#include "urg_sensor.h" 7#include "urg_utils.h" 8#include "urg_serial_utils.h" 9#include "urg_errno.h" 10#include "urg_debug.h" 11} 12 13using namespace qrk; 14using namespace std; 15 16//connection_type_tは抽象クラスLidar.hで定義されている構造体(下記)です。 17 18//typedef enum { 19// Serial, 20// Ethernet, 21// } connection_type_t; 22 23bool UrgLib::open(const char* device_name, long baudrate, 24 connection_type_t type) 25{ 26 close(); 27 pimpl->product_type_.clear(); 28 pimpl->firmware_version_.clear(); 29 pimpl->serial_id_.clear(); 30 31 urg_connection_type_t connection_type = 32 (type == Ethernet) ? URG_ETHERNET : URG_SERIAL; 33 int ret = urg_open(&pimpl->urg_, connection_type, device_name, baudrate); 34 if (ret < 0) { 35 return false; 36 } 37 38 return true; 39}
あなたの回答
tips
プレビュー