Open YuukiReiya opened 2 years ago
今回はCppSharpが使えそうだと思ったのでリポジトリ用意して検証しつつ組み込んでみる。
リポジトリのリンクはこちら ※PrivateRepository
メソッドを呼び出そうとした際に出たエラー。 32ビットの選択されていないので別原因ぽい。 これが原因そうだけど必要なdllがいまいちわからないのでサンプルをforkして直接動かしてみる
System.BadImageFormatException:
間違ったフォーマットのプログラムを読み込もうとしました。 (0x8007000B)
at Cpp.Foo.__Internal.FooAdd(IntPtr foo)
at Cpp.Foo.FooAdd(Foo foo) in C:\Users\yuki\Documents\develop\T\CppSharp_NativeBind\Project\Software\Software\scripts\external\Cpp.cs:line 115
at CSharp.Program.Main(String[] args) in C:\Users\yuki\Documents\develop\T\CppSharp_NativeBind\Project\Software\Software\scripts\common\Program.cs:line 23
概要
87 C++でLuaの組み込みが確認出来た。
UnityC#のCLにLua処理を組み込むためにLua処理をWrapしたC++のNativePluginを利用する。
.NetFramework
はネイティブライブラリ中の機能を呼び出すための機能を備えておりP/Invoke(Platform Invoke)
と呼ぶらしい。 P/Invoke (Platform Invoke: プラットフォーム呼び出し)と呼びます。C#で
P/Invoke
を使う方法の例は以下◆C-Style関数
6 いつもやってるやり方。
extern"C"
を利用してC++の関数をC言語の関数としてWrapすることで呼び出す。利用する属性:
DllImport属性
◆COMオブジェクト
COM(Component Object Model)
はプログラミング言語を跨いでクラスやメソッドを使うための規格。実際の利用方法はここを参考。
利用する属性:
ComImport属性
C#からCOMオブジェクトを呼び出すためのWrapperクラスを
RCW(Runtime Callable Wrapper)
と呼ぶ。 反対にC#で書いたクラスをCOM側から使う手段をCCW(COM Callable Wrapper)
と呼ぶ。.NET Framework 4
以降の挙動変更やPIA(Primary Interop Assembly:プライマリ相互運用アセンブリ)
に関しては必要に応じて別途調べる。◆WinRTコンポーネント
Windows8以降実装された新しいWindowsAPI。 内容は基本的にCOMの上位互換らしい。
実際の利用方法はこちらを参考。 ただAndroid/iOSのマルチプラットフォーム運用できるかが未知数なのでやめた方がいいかも? 少なくともしっかりテストをしないとダメそう。
他参考
今回はCppSharpが使えそうだと思ったのでリポジトリ用意して検証しつつ組み込んでみる。