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

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

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

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

C++

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

Q&A

解決済

1回答

2893閲覧

C#クラス構造のC++/CLI版作成による型変更

JanTh1989

総合スコア87

C#

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

C++

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

0グッド

0クリップ

投稿2019/04/09 03:39

編集2019/04/09 21:53

前提

C#⇒C++/CLIの流れで動くライブラリ(DLL)作っています。
◆C++/CLIで実現したいこと
・XMLを読み込んで、自作クラスに値を割り当てて、C#に返す。
◆C#で実現したいこと
・C++/CLIから取得したクラスをベースにNewtonsoft.JsonライブラリでJson文字列へ変換
・作成したJson文字列を同様にNewtonsoft.JsonライブラリでJObject型作成。

C#であればC++/CLIで実現したいもののクラス構造、処理は算段は立ったのですが、さてC++/CLIで作る、となると知識・経験不足で難航しています。

●C++/CLIで作りたいクラス構造(C#版)

C#

1// C#で作る場合のクラスイメージです。 2// C#が呼び出すインタフェースクラス・メソッド 3public class Analyze 4{ 5 pubic JsonClass XMLAnalyze(string filePath) 6 { 7 // 処理省略 8 } 9} 10// JSONに変換するクラス群 11// メソッドはコンストラクタのみ記載。他メソッドは省略。 12internal class JsonClass 13{ 14 public ProfileList profileList; 15} 16internal class ProfileList 17{ 18 public List<Member> memberList; 19 public ProfileList() 20 { 21 memberList = new List<Member>(); 22 } 23} 24internal class Member 25{ 26 public string name; 27 public int? age; 28 public List<Carrer> carrerList; 29 30 public Member() 31 { 32 name = null; 33 age = null; 34 carrerList = new List<Carrer>(); 35 } 36} 37internal class Carrer 38{ 39 public string name; 40 pubilc int? years; 41 public Carrer() 42 { 43 name = null; 44 years = null; 45 } 46}

●C++/CLIのクラス定義

C++

1ref class Analyze; 2class JsonClass; 3class ProfileList; 4class Member; 5class Carrer;

●作りたいJsonイメージ

JSON

1{ 2 "profileList": [ 3 { 4 "memberList": [ 5 { 6 "name":"Tanaka", 7 "age":null, 8 "carrerList":[ 9 { 10 "name":null, 11 "years":5 12 } 13 ] 14 } 15 ] 16 } 17 ] 18}

●C#の処理
「C#で作る場合のクラスイメージ」の

C#

1dynamic jsonClass = XMLAnalyze("ファイルパス"); 2string jsonStr = JsonConvert.SerializeObject(jsonClass); 3JObject jobject = JObject.Parse(jsonStr);

質問内容

C++/CLIで生成したクラスをC#で受け取って、プロパティのint型にnullが入っているという状態になる方法に難航しています。
C#にはint?のようにnull許容型がありますが、C++には無い認識です。
JSON変換にあたって、数値型でもXMLに該当するタグが無ければ、「"age":null」のように"null"でも0でもなく、nullにしたいです。
C++がC#にクラスデータを送り、受け取ったクラスのint型プロパティがnull許容型となる方法はありますでしょうか?

補足

開発環境:VisualStudio2015 Professional
.NET:バージョン4.6

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

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

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

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

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

Zuishin

2019/04/09 03:42

この質問は前回の質問で回答しました。
JanTh1989

2019/04/09 05:23

前回の質問とはどれをさしていらっしゃるでしょうか? 動的参照によるC#⇒C++/CLIの定数、列挙体参照の質問でしょうか? 私の認識では、別の内容の質問と考えています。 現状は調査を進め、operatorキーワードによるオーバーロードを見ている状況です。
moredeep

2019/04/09 05:38

ちょっと質問が盛りだくさん過ぎてただ丸投げしているように見えます。 前提を見る限り、refクラスで"C#が求めるC++/CLIから返ってくるクラス構造"を実装するだけで終わりだと思うのですが、どこで詰まっているのでしょうか。 C++/CLIとの接し方がわからず右往左往しているようならば、進め方(何から調査して、まずはこう実装して~)をどうすればよいか尋ねる等もできるかと思います。 > C#⇔C++/CLIの型変換に難航 前提を見る限り、なぜ必要なのかが不明です。 > Null許容型のint型にnull、string型にnull、についても方法が理解できていません すみませんが、この文章の意図を汲み取れませんでした。("何がしたい"、"何が(なぜ)出来ない") > C#クラスイメージのC++版を生成するには、どのような構造になっていればよろしいのでしょうか? 丸投げです。せめて自分で試行したものを提示しましょう。
JanTh1989

2019/04/12 09:26

最初に記載されているrefクラスにするという内容で、 '^'などをきちんと入れれば、大半の問題が解決しました。 また、前提内容が良くないなどの指摘ありがとうございます。 変更へ取り掛かれなかったほか、回答も遅くなり、申し訳ありませんでした。
guest

回答1

0

ベストアンサー

とりあえず、C#のみで呼び出す関数を作ってみましょう。
XMLを読み込むですから、こんな感じでしょうか。

XMLData XMLLoad(string filename){ return new XMLData(); // 中身はエラーにならないように適当に作成 }

返り値のXMLDataに関してもC#(厳密にはManaged)で作る必要があります。

おそらくC++用のライブラリがあって、そこに定義されていると思いますが、
それはC++/CLIの世界では使えても、C#に持ち出すことが出来ません。
したがって、C++/CLIの中で変換する必要があります。

std::stringはstring^に、std::vector<int> はList<int>^ など、
C++の書式をC#の書式に変換する必要があります。
多分、この変換をせずにC#に持っていこうとして躓いている気がします。

投稿2019/04/09 07:20

izmktr

総合スコア2856

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

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

JanTh1989

2019/04/11 06:54 編集

回答が遅くなりました。 躓いている箇所はおっしゃる通りになります。 一部方法を解決(恐らく)したものは、プロパティのstring、int?になります。 C#  |C++ string |String^ int?  |Nullable<Int32> 現状で躓いているのは、動的配列のメンバ変数になります。 C++ class ProfileList { public: Generic::List<Member> memberList; ProfileList(); } class Member { String^ name; Nullable<Int32> age; Generic::List<Carrer> carrerList; public Member(); } いくつかある動的配列系を見たのですがうまくいかず・・・。 <使おうとしてみたもの> Generic::List、std::list、std::vector、cliext::list、cliext::vector <エラー> ①マネージクラスのメンバーを非マネージクラス型にすることはできません。 ②C2558 コピーコンストラクタがしようできないか、'explicit'として宣言されています。 ③C4485 'cliext::impl::list_select<_Value_t,true>::front_item::get': 基本 ref クラス メソッド 'cliext::impl::list_impl<_Value_t,true>::front_item::get' と一致しますが、'new' または 'override' に設定されていません。'new' (および 'virtual') を仮定します など。
izmktr

2019/04/11 06:51

× int?  |Nullable<Int32> ○ int?  |Nullable<Int32> ^ ほかも直していきましょう
JanTh1989

2019/04/11 06:55

ありがとうございます。 Nullable<Int32>^で問題なくデータ取得できました。 動的配列は引き続き調査をしていきます。
JanTh1989

2019/04/12 09:21

好ましい形にはなりませんでしたが、一応コレクション型系のメンバ変数化もできました。 ◆解決方法 クラスすべてをpublic refのクラスに変更。 あとは以下の書き方でエラーがなくなりました。  例)Generic::List<Member^>^ memberList;
JanTh1989

2019/04/12 09:28

仕様変更などが出て、List型に動的型をメンバ変数で持つのはどうしたものか・・・という課題なども残っていますが、当初の内容については解決しましたので、この質問は閉めさせて頂きます。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問