thaseponのチラシ裏

気が向いた時や詰まっていたバグなどを解決した時に書いたりしてます。twitter : twitter.com/thasepon1023

Unity開発時のC++DLL作成の際の注意点

あまりに暑くてプログラムを組む気力がごりごり減ってるはせぽんです。
かといって何もしないのもどうかなと思ったのでブログを書こうかなと…

今回の話は
Unity(C#)からdll(VS C++)の関数呼び出しについて
のお話。

まず基本的な情報に関しては凹みさんの
tips.hecomi.com
を見れば解決すると思います。

じゃあなんで記事書いたの?ってなるのですがマーシャリングやら文字列やらで詰まったのでそれについて少し書こうかなと

そもそもマーシャリングって何?

ってなると思うのですがC#C++間の橋渡しのようなもの、だと個人的に思っています(違う可能性もあります)。
確かに冷静に考えれば言語が違うのに通じるわけはないので何かしらする必要がある(英語から日本語へ通訳みたいな)とは思いましたが。

マーシャリングの壁?
一応色々あったにはあったのですが今回は特に思い出深い内容を

マネージ コードからのネイティブ関数の呼び出し

こちらは対応表になっているのですがdll側はunicodeで作っていたので、[文字列を 2 バイトの Unicode 文字列 LPWStrでマーシャリング ]という例に習って作ったのですが、まぁ、これがとても面倒だったんですよね。

それが
ワイド文字 - Wikipedia ここの内部表現に書いてあるのですが。

しかし、Windowsでは16ビット (UTF-16)、LinuxmacOSでは32ビット (UTF-32) であるため、その他の環境でもUnicodeを用いた符号化形式であると誤解されて、あるいは仮定してプログラムが作られることがある。

えぇ…('ω' )

これが大体の元凶です、こういう事が初めてだった私にとって「何言ってるんだ?」って感じでした。

一応解決へ・・・

このことをtwitterでつぶやいたところ
twitter.com さんから様々な情報が、色々あるのですが大まかには

  • Unityは.NetではなくMonoである
  • P/Invokeでstring(C#)をconst char*(C)に変換するとUTF-8
  • 上で書いた環境ごとの差

などの話をしました、ここでさらに
twitter.com
さんの参戦により解決は加速します

その答えは


という事でした


難しいね!プラグイン作成!
(ここまで話はしましたけどひとまず私はwchar_t使ってます、ちゃんと直さなきゃ)