質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

structure

このタグは、プログラム言語におけるデータ型structure(構造体)に関するタグです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

解決済

c++、c++/CLI、c#のstructのマーシャリングについて

wave_vague
wave_vague

総合スコア20

C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

structure

このタグは、プログラム言語におけるデータ型structure(構造体)に関するタグです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1回答

0評価

0クリップ

392閲覧

投稿2022/03/10 06:15

編集2022/03/15 11:42

下記サイトからフリーダウンロードできるライブラリを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

#include "pch.h" #include "ticks.h" extern "C" { #include "urg_sensor.h" #include "urg_utils.h" #include "urg_serial_utils.h" #include "urg_errno.h" #include "urg_debug.h" } #include "UrgDriver.h" #include <string> #include <vector> #include <msclr\marshal.h> using namespace msclr::interop; using namespace qrk; namespace QRK { UrgDriver::UrgDriver(void) { urg_ = new urg_t; urg_t_initialize(urg_); } UrgDriver::~UrgDriver(void) { Close(); } bool UrgDriver::StartMeasurement(MeasurementType type, int scan_times, int skip_scan) { typedef struct { //struct部分にてマネージドクラスのメンバー関数ではローカルクラス定義は使用できません urg_measurement_type_t c_type; MeasurementType type; } type_table_t; type_table_t type_table[] = { { URG_DISTANCE, QRK::MeasurementType::Distance }, { URG_DISTANCE_INTENSITY, QRK::MeasurementType::Distance_intensity }, { URG_MULTIECHO, QRK::MeasurementType::Multiecho }, { URG_MULTIECHO_INTENSITY, QRK::MeasurementType::Multiecho_intensity }, }; size_t n = sizeof(type_table) / sizeof(type_table[0]); for (size_t i = 0; i < n; ++i) { const type_table_t* p = &type_table[i]; if (type == p->type) { int ret = urg_start_measurement(urg_, p->c_type, scan_times, skip_scan); if (ret == URG_NO_ERROR) { last_measure_type_ = type; } return (ret == URG_NO_ERROR) ? true : false; } } return false; } bool UrgDriver::GetDistanceIntensity(System::Collections::Generic::IList<int>^ data, System::Collections::Generic::IList<unsigned short>^ intensity, int% time_stamp) { if (last_measure_type_ != QRK::MeasurementType::Distance_intensity) { urg_.last_errno = URG_MEASUREMENT_TYPE_MISMATCH; return false; } // 最大サイズを確保し、そこにデータを格納する size_t data_size = MaxDataSize(); data.resize(data_size); //①resize部分にて、class "System::Collections::Generic::IList<int>"にメンバー"resize"がありません intensity.resize(data_size); //①と同じエラー int ret = urg_get_distance_intensity(urg_, &data[0], &intensity[0], (long*)time_stamp);//1. dataおよびintensity部分にて、式は左辺値または関数指定子である必要があります if (ret > 0) { data.resize(ret); //①と同じエラー intensity.resize(ret);//①と同じエラー adjust_time_stamp(time_stamp); } return (ret < 0) ? false : true; } }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

structure

このタグは、プログラム言語におけるデータ型structure(構造体)に関するタグです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。