C# と外部関数のメモ
C++ のクラスは C# からは扱いにくいので ManagedC++ でラッパを作るのが普通だとは思うけど、
試しに C++ 側を工夫してみるという、普通じゃないことをやってみた。
具体的には
class Foo { public: Foo(); void Bar(); };
みたいなコードを書いても C# からどうやって使えば良いかわかんなかったんで
extern "C" { typedef struct {} Foo; // 構造体 Foo Foo* __declspec(dllexport) Foo_New(); // Foo.Foo() の代用 void __declspec(dllexport) Foo_Bar(Foo* self); // Foo.Bar() の代用 }
みたいに変更した。これならば C# からは
[DllInport("Hoge.dll")] extern IntPtr Foo_New(); [DllInport("Hoge.dll")] extern void Foo_Bar(IntPtr self);
で扱うことが出来る。
クラス継承を扱えないが……まあ、継承を使う部分もラップしてしまえば良いだろう。
コンセプトは、C# 側に余分なコードを増やさないということだ。今決めたコンセプトだけど。
ちなみに、Io というプログラム言語のインタプリタも、同様の構造で作られてます。
こっちは C でオブジェクト指向というコンセプトの元に。