• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C++/CLIのDLLを、C#で参照した際の変数型)

C++/CLIのDLLをC#で参照した際の変数型

このQ&Aのポイント
  • C++/CLIで作成したDLLをC#で参照する際に、引数の変数型が変わってしまう問題について調査中です。
  • C++/CLI側でulongで定義した引数が、C#で参照した際にuintに変わってしまう問題が発生しています。
  • 現在、DLLの参照はできているが、引数の型が変わる問題について、解決策をご教授いただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

C++のlongは通常32bitで32bit処理系ではintと同じサイズのことが多い。 # 言語規約上は32bitで表せる数値範囲をカバーしていることが要求される # ちなみにintは16bitで表せる数値範囲をカバーしていれば良い それに対してC#のlongは64bitあり、32bitなのはintなので、C++のlongに対応させるのはC#ではintになる。 C#上でlongに対応させるならC++ではlong longその他の64bit長を確保できる型を使う必要があるだろう。 # VC++だと__int64だったか。

kokukuma
質問者

お礼

わかりやすいご回答ありがとうございます。 C++の「long型」はC#の「int型」に対応しているから、 C#側で使う場合はint型のまま使えば、よいということですね。 他にも、C++の「char型」が、C#では「sbyte型」に変わっていたのですが、同じ理由なのでしょうね。 ありがとうございました!。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

C++/CLI の規格は ECMA-372 ですが, これによると 「C++ の型と CLI の型の対応は実装依存」 Each of the fundamental types has a corresponding value class type provided by the implementation; the correspondence is implementation-defined (8.2.1 Fundamental types and the CLI) だそうです>#3. 「ただC++ CLIだと処理系として扱う型のサイズは確定します」というのはこの限りにおいて正しいけど, それは C や C++ でも同じなので C や C++ と C++/CLI とを区別する意味はないと思います. つまり kokumura さんの使った処理系では「C++/CLI の ULONG と C# の UINT が対応している」ということになりますが, 他の処理系でこの対応が保障されるということではないと思います. もちろん (#2 に書いたように) System 名前空間内の型を使えば (CTS の型に対応するので) C++/CLI と C# との間で厳密な型の一致をさせることも可能です.

kokukuma
質問者

お礼

運用後にマシンを変えなきゃってときのことを考えると恐ろしいですね。 System 名前空間内の型を利用する方法を検討したいとおもいます。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.3

charもC#ではUnicode 16ビット文字を格納する型ですから。 C/C++のcharは多くの処理系で8bit型ですからC#ではbyte型なのでしょう。 # sbyteとしているということはC/C++のcharがsigned charの前提なのでしょう C/C++の言語規約は、各型のサイズを厳密に規定していません。ただC++ CLIだと処理系として扱う型のサイズは確定します。C#との変換はその条件でやっていると思います。

kokukuma
質問者

お礼

今まで、言語ごとの型の仕様まで考えられ手ませんでしたので、今日1つ上の考えに触れられ、自分自身少しレベルアップしたように感じます。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

C++ の言語仕様上 char が符号付きか符号なしかは規定されていません (処理系定義). もっというと, 他の整数型 (short int, int, long int) とは違って char, signed char, unsigned char の 3つの (すべて異なる) 型が存在します (int だと int = signed int だけど). なので, 他の処理系 (他の言語を含む) 場合には注意が必要となります. もちろん「char の大きさ」も決まっていない (「1バイト」ではあるけどビット数は規定されていない) ということも念頭に置く必要があるかもしれません. というか, C++/CLI なら System 名前空間内の型が使えるような気がする.

kokukuma
質問者

お礼

ご回答ありがとうございます。 言語毎の型の仕様について、 掘り下げて考えたことが今迄なかったので、 本当に勉強になります。 >C++/CLI なら System 名前空間内の型が使えるような気がする. このあたりももっと勉強してみます。 ありがとうございます。

すると、全ての回答が全文表示されます。

関連するQ&A