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 でオブジェクト指向というコンセプトの元に。