YuukiReiya / MyFramework

オンライン制作用。
3 stars 0 forks source link

【Develop】cppsharpを用いたC++コードのC#へのバインド #88

Open YuukiReiya opened 2 years ago

YuukiReiya commented 2 years ago

概要

UnityC#のCLにLua処理を組み込むためにLua処理をWrapしたC++のNativePluginを利用する。

.NetFrameworkはネイティブライブラリ中の機能を呼び出すための機能を備えておりP/Invoke(Platform Invoke)と呼ぶらしい。 P/Invoke (Platform Invoke: プラットフォーム呼び出し)と呼びます。

C#でP/Invokeを使う方法の例は以下

◆C-Style関数

◆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が使えそうだと思ったのでリポジトリ用意して検証しつつ組み込んでみる。

YuukiReiya commented 2 years ago

今回はCppSharpが使えそうだと思ったのでリポジトリ用意して検証しつつ組み込んでみる。

リポジトリのリンクはこちら ※PrivateRepository


YuukiReiya commented 1 year ago

err_! メソッドを呼び出そうとした際に出たエラー。 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
YuukiReiya commented 1 year ago

image

生成されたコードはunsafeらしいのでアンセーフコードの許可をする

unsafe_ok