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

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

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

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

C#

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

Q&A

1回答

2712閲覧

C#とC++/CLI(ラッパー関数)で同じ構造体をやり取りするには?

退会済みユーザー

退会済みユーザー

総合スコア0

C++/CLI

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

C#

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

0グッド

1クリップ

投稿2021/08/26 02:32

編集2021/08/27 01:05

C#とDLLとのやり取りするC++/CLIで作成のラッパークラスを作成しています。

C#で定義している構造体とDLLからの呼び出す構造体が同じ構造になっています。しかし、C#とラッパー内では別々の定義にした場合は、下記のような記述ではエラーになります。

例:構造体Exampleについて、やり取りする場合

---C#からは

[StructLayout(LayoutKind.Sequential)] public struct Example { public int lMode; public int lFileSize; public ushort usUpdate; } // ラッパー関数からDLLの値を取得する Example typDummy = new Example(); uint ret = GetDLLData(ref Example) ;

---ラッパークラス(C#/CLI)からは

typedef struct { public: int lMode; public: int lFileSize; public: unsigned short unUpdate; } Example ; uint GetDLLData(Example %typDat) { return GetNativeDLL(&typDat) ; }

上記のようなコードを組むと、文法エラーが発生して、「コーディングの段階で、文法エラーが発生し、"引数2:は'a.Example'から'ref Example'に変換することはできません。"」となります。

当然のエラーですが、エラーを発生しないようにするにはどのようにコードを組めばよいのでしょうか?
なお、現在は、C++/CLI側の構造体をC#側で共通利用することで回避していますが、上記のように同じ構造だが、構造体としては別となる場合はどう記述すればいいのか教えてください。よろしくお願いします。

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

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

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

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

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

Zuishin

2021/08/26 02:35

タイトルが C#/CLI になってますよ。
退会済みユーザー

退会済みユーザー

2021/08/26 02:48

失礼しました。訂正しました。
KoichiSugiyama

2021/08/26 05:27

エラーメッセージを省略せずにコピー&ペーストして追記してください。どんなエラーが出ているかわかるだけで実際に動かしてみなくても問題のある個所を指摘できる方もおられると思います。
退会済みユーザー

退会済みユーザー

2021/08/26 23:59

書き方が判らないだけなら、MicrosoftのC++/CLIのドキュメント読めばいいのでは?
退会済みユーザー

退会済みユーザー

2021/08/27 00:07

遅くなりまして申し訳ございません。 コーディングの段階で、文法エラーが発生し、"引数2:は'a.Example'から'ref Example'に変換することはできません。"です。当たり前のエラーですが、これから呼出可能状態にどう変更したらいいかご教授ください。
退会済みユーザー

退会済みユーザー

2021/08/27 00:10

ここは追記修正依頼欄なので、エラーは質問文に編集して書きこんでください。
退会済みユーザー

退会済みユーザー

2021/08/27 01:05

追記しました。
guest

回答1

0

DateTime dtUpdateはManagedだから、NativeMethodsに渡せない(しNativeな構造体にならない)のは当然だとおもうんだけど、どういうマーシャリング期待してるの?
C++側のNativeな構造体を、たとえば下記のようにして、 uint GetDLLData(Example %typDat)では、ManagedなExampleとNativeExampleをつみかえる必要があるんじゃないかな。

なお、DateTimeの問題がなければの話であれば、C++/CLI要らないのでは?。同一の中身でManaged→Native間のやりとりって、まんまPInvokeマーシャラの役割でしょう。

C++

1struct NativeExample { 2 int lMode; 3 int lFileSize; 4 long long dtUpdate; 5}; 6 7uint GetDLLData(Example %typDat) 8{ 9 NativeExample ndat = { typDat.lMode, typDat.lFileSize, typeDat.dtUpdate.ToBinary()}; 10 return GetNativeDLL(&ndat ); 11}

投稿2021/08/26 10:05

matukeso

総合スコア1677

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

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

退会済みユーザー

退会済みユーザー

2021/08/26 23:55

おっしゃる通り、PInvokeマーシャラで解決できる話です。 が、他の呼び出しDLLをまとめて、ラッパークラスに組み込みたいと考えているため、質問しています。 質問が悪かったため、構造体のメンバーの型を訂正しました。
matukeso

2021/08/27 01:32

ラッパークラスをc#で書けばいいじゃん。
退会済みユーザー

退会済みユーザー

2021/08/27 01:52

質問のことをやりたいだけなら、C++/CLRを挟む必要は全くないですね。 managedとunmanagedの構造体の違いが判らないって話なら、本当に基礎的な話なのでC++/CLRのドキュメント読んでくださいとしか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問