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

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

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

charは文字データ型を指します。一文字分の文字コードの格納を想定としている型です。

C++/CLI

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

C#

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

C++

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

Q&A

解決済

2回答

957閲覧

C#から、C++クラスメソッドの実行

wave_vague

総合スコア21

char

charは文字データ型を指します。一文字分の文字コードの格納を想定としている型です。

C++/CLI

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

C#

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

C++

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

0グッド

0クリップ

投稿2022/03/08 02:21

編集2022/03/08 02:23

C++のクラスをC#で利用したいため、CLIラッパクラスを作成しています。

c#からc++のメソッドを呼ぶ際、const char*型のメソッドを呼ぶ際に
CS0214 ポインターおよび固定サイズ バッファーは、unsafe コンテキストでのみ使用することができます
とエラーが表示されており呼び出すことができません。
いくつかサイトを検索してみましたが、参考になるページが見つからなかったためご教示お願いいたします。

Test.h

1#ifdef DLL_EXPORTS 2#define DLL_API __declspec(dllexport) 3#else 4#define DLL_API __declspec(dllimport) 5#endif 6 7#include <memory> 8#include <string> 9#include <vector> 10#include <cstddef> 11 12namespace qrk 13{ 14 class DLL_API Dll 15 { 16 public: 17 const char* name(void) const; 18 19private: 20 struct pImpl; 21 std::auto_ptr<pImpl> pimpl; 22 23 }; 24}

Test.cpp(cppファイル)

1#include "pch.h" 2#include "Test.h" 3 4using namespace qrk; 5using namespace std; 6 7struct Test::pImpl 8{ 9 product_t product_; 10 11 string name_; 12 13 14 pImpl(void) 15 :last_measure_type_(Distance), time_stamp_offset_(0) 16 { 17 urg_t_initialize(&urg_); 18 } 19}; 20 21Test::Test(void) : pimpl(new pImpl) 22{ 23} 24 25Test::~Test(void) 26{ 27} 28 29const char* qrk::Test::name(void) const 30{ 31 if (pimpl->name_.empty()) { 32 pimpl->name_ = product_name(&pimpl->product_); 33 } 34 return pimpl->name_.c_str(); 35} 36

WrapperClass.h(ラッパクラスのヘッダファイル)

1#include "../Test/Test.h" 2 3using namespace System; 4using namespace System::Runtime::InteropServices; 5using namespace System::Collections::Generic; 6 7namespace Wrapper 8{ 9 public ref class WrapperClass 10 { 11 12 private: 13 qrk::Test* _test; 14 15 public: 16 WrapperClass(); 17 ~WrapperClass(); 18 !WrapperClass(); 19 20 const char* name(void); 21 22 }; 23} 24

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 _test = new qrk::Test(); 11} 12 13Wrapper::WrapperClass::~WrapperClass() 14{ 15 delete _test; _test = nullptr; 16} 17 18Wrapper::WrapperClass::!WrapperClass() 19{ 20 this->~WrapperClass(); 21} 22 23const char* Wrapper::WrapperClass::name(void) 24{ 25 return _test->name(); 26} 27

Sample.cs(C#のクラス)

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6using System.Runtime.InteropServices; 7using Wrapper; 8 9namespace SampleTest 10{ 11 public class Sample 12 { 13 //WrapperClassのインスタンスを作成 14 WrapperClass wr = new WrapperClass(); 15 16 public bool getSensorParameter() 17 { 18 if (wr.name() == "") //CS0214 ポインターおよび固定サイズ バッファーは、unsafe コンテキストでのみ使用することができます 19 { 20 return false; 21 } 22 return true; 23 } 24 25 } 26}

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

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

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

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

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

guest

回答2

0

ベストアンサー

せっかくのラッパーなんだから、Managed側にchar *で返すとかは止めて、そこでString^に変換してかえせばいいのでは。

C++

1System::String ^Wrapper::WrapperClass::name(void){ 2 return System::Runtime::InteropServices::Marshal::PtrToStringAnsi( (System::IntPtr) (void*)_test->name() ); 3}

投稿2022/03/08 16:20

編集2022/03/09 02:06
matukeso

総合スコア1590

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

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

wave_vague

2022/03/09 01:22

回答ありがとうございます。 ご教示いただいた内容を実施してみたところ、_test->name()の_test箇所にて、 "const char*"から "System::IntPtr"への適切なユーザー定義変換が存在しません とエラー表示されました。 原因分かりますでしょうか?
wave_vague

2022/03/09 02:12

回答編集ありがとうございます。 エラー解消しました。 自分なりに検索してみたのですが、下記実装でもmatukeso様にご教示いただいた内容と同等の処理ができますでしょうか? System::String^ Wrapper::WrapperClass::name(void) { return marshal_as<System::String^>(_test->name()); }
matukeso

2022/03/09 02:18

それでもいいとおもいますよ。
wave_vague

2022/03/09 02:28

ありがとうございます。勉強になりました。
guest

0

cs0214 で検索すると https://docs.microsoft.com/ja-jp/dotnet/csharp/misc/cs0214 がヒットして、そこに「C# 側のメソッドに unsafe キーワードを付ければ呼び出せる」という説明がありますよ。

投稿2022/03/08 02:56

bboydaisuke

総合スコア5275

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問