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

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

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

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

C#

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

C++

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

Q&A

0回答

776閲覧

c#からc++抽象クラスのtypedef enumを引数に持つc++/CLIメソッドを呼ぶ方法について

wave_vague

総合スコア21

C++/CLI

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

C#

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

C++

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

0グッド

0クリップ

投稿2022/03/10 06:58

編集2022/03/10 08:27

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}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wave_vague

2022/03/11 00:38

WrapperClassのヘッダでメンバ変数としてシリアル、イーサネット両方をpublic のqrk::UrgLib::connection_type_tで宣言し、c#側でシリアルの場合はシリアルを第三引数に、イーサネットの場合はイーサネットを第三引数にすることで動作できています。 もし、他によい方法があれば教えていただきたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問