CLIP STUDIO PAINTのプラグインをC#で書きたい!(2)

あすかです。

前回投稿から1ヶ月がたってしまいました。。
この1ヶ月、夏コミにサークル参加するので、その準備(コピー本とかコピー本とかコピー本とか)をしてたりしました。
やっと一段落つきましたが、今度は冬コミ‥もとい来年2月のコミティアに向けて、技術本を書くことにしました。
技術本については、冬コミコミティアのどちらかに当選次第、またこのブログで案内しますね。
というわけで、このブログの更新がしばらく雑になります。

さて、前回どういう話でしたっけ‥ああ、CLIP STUDIO PAINTプラグインで使う関数をC#から呼び出す話でしたね。

kmycode.hatenablog.jp

マネージドコードからアンマネージドコードの関数を呼び出す時はDLLImportの利用が一般的ですが、
今回、SDK内の関数の定義を見るに、今回生成するC++のDLL内で関数が定義されているわけではないので、DllImportは使えません。

じゃあどうすればいいのでしょうか。C++で、SDKの関数を呼び出すラッパ関数を作っておいて、その関数のポインタを.NETに渡すことにします!
ただ、C++の関数のポインタをそのままマネージドコードに取り込むことはできないので、.NETのデリゲートというものを使います。


まず、C#のコードを以下のように修正します。

C#のクラスで、TestActionというプロパティを作ってみました。このプロパティに、C++の関数のポインタを登録します。

1~3行目と、9行目のobj->TestAction = gcnew System::Action(&FuncTest);が、今回追加されたコードになります。
C++でまず関数を作っておいて、そのポインタをデリゲートとして.NETに渡す感じですね。
C#からSDKの関数を呼び出す時は、これを利用します。

といっても、今回はあまり時間をかけたくないので、getHostVersionProc関数をC#から呼び出せるようにして、ホストのバージョンを画面に表示するプログラムを書いてみます。
まず、TriglavPluginCall関数内のコードをちょっと修正します。C#プラグインを呼び出す関数の引数と、呼び出す位置を変えています。

次に、C#プラグインを呼び出す関数を修正しています。
関数のポインタをデリゲートに変換して、.NETのほうのプロパティに渡しています。

次はC#のマネージドコードです。
関数のポインタをデリゲートという形で受け取った上で呼び出しています。

これを実行してみると、見事ホストバージョンが画面に表示されました。

f:id:kmynews:20170820110731p:plain

最新バージョンでは、ホストバージョンは3なんですね・・・。