下記サイトからフリーダウンロードできるライブラリをc#で使用したいと思っております。
その際に、下記ライブラリは*.libしか作成されないため、*.dllを作成する必要があります。
*.dllを作成するにあたり、提供されているライブラリがクラスになっているため、c++/CLIラッパを採用して作成しています。
Urg_driver.cppを直接ラッピングしたUrgDriver.cppを新規で作成しています。
https://sourceforge.net/projects/urgnetwork/files/urg_library/urg_library_ja-1.2.5.zip/download
UrgDriver.cpp
1#include "pch.h" 2 3#include "ticks.h" 4extern "C" { 5#include "urg_sensor.h" 6#include "urg_utils.h" 7#include "urg_serial_utils.h" 8#include "urg_errno.h" 9#include "urg_debug.h" 10} 11 12#include "UrgDriver.h" 13#include <string> 14#include <vector> 15#include <msclr\marshal.h> 16 17using namespace msclr::interop; 18using namespace qrk; 19 20namespace QRK 21{ 22 UrgDriver::UrgDriver(void) 23 { 24 urg_ = new urg_t; 25 urg_t_initialize(urg_); 26 } 27 28 UrgDriver::~UrgDriver(void) 29 { 30 Close(); 31 } 32 33bool UrgDriver::StartMeasurement(MeasurementType type, 34 int scan_times, int skip_scan) 35 { 36 37 typedef struct { //struct部分にてマネージドクラスのメンバー関数ではローカルクラス定義は使用できません 38 urg_measurement_type_t c_type; 39 MeasurementType type; 40 } type_table_t; 41 42 43 type_table_t type_table[] = { 44 { URG_DISTANCE, QRK::MeasurementType::Distance }, 45 { URG_DISTANCE_INTENSITY, QRK::MeasurementType::Distance_intensity }, 46 { URG_MULTIECHO, QRK::MeasurementType::Multiecho }, 47 { URG_MULTIECHO_INTENSITY, QRK::MeasurementType::Multiecho_intensity }, 48 }; 49 50 size_t n = sizeof(type_table) / sizeof(type_table[0]); 51 for (size_t i = 0; i < n; ++i) { 52 const type_table_t* p = &type_table[i]; 53 if (type == p->type) { 54 int ret = urg_start_measurement(urg_, 55 p->c_type, scan_times, skip_scan); 56 if (ret == URG_NO_ERROR) { 57 last_measure_type_ = type; 58 } 59 return (ret == URG_NO_ERROR) ? true : false; 60 } 61 } 62 return false; 63 } 64 65bool UrgDriver::GetDistanceIntensity(System::Collections::Generic::IList<int>^ data, System::Collections::Generic::IList<unsigned short>^ intensity, int% time_stamp) 66 { 67 if (last_measure_type_ != QRK::MeasurementType::Distance_intensity) { 68 urg_.last_errno = URG_MEASUREMENT_TYPE_MISMATCH; 69 return false; 70 } 71 // 最大サイズを確保し、そこにデータを格納する 72 size_t data_size = MaxDataSize(); 73 data.resize(data_size); //①resize部分にて、class "System::Collections::Generic::IList<int>"にメンバー"resize"がありません 74 intensity.resize(data_size); //①と同じエラー 75 int ret = urg_get_distance_intensity(urg_, 76 &data[0], &intensity[0], (long*)time_stamp);//1. dataおよびintensity部分にて、式は左辺値または関数指定子である必要があります 77 if (ret > 0) { 78 data.resize(ret); //①と同じエラー 79 intensity.resize(ret);//①と同じエラー 80 adjust_time_stamp(time_stamp); 81 } 82 return (ret < 0) ? false : true; 83 } 84 85} 86
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/03/11 00:32
2022/03/11 03:51
2022/03/11 05:34
2022/03/11 07:38
2022/03/11 08:33
2022/03/11 12:22
2022/03/14 04:59
2022/03/14 05:47
2022/03/14 07:06 編集
2022/03/14 07:01
2022/03/14 08:11
2022/03/14 08:21
2022/03/14 08:34
2022/03/15 02:42