2012-02-16 21 views
2

私のエンジンの機能をC++からC#に移そうとしています。 私は管理対象外のC++を使用してdllとしてエンジンをコンパイルし、C#ラッパーでextern "C"関数のみを使用します。C++からC#への3Dベクトル構造

私は、Vector3dfを受け取り返すさまざまな機能を持っています。これは

typedef Vector3d<f32> Vector3df; 

f32実際floatであると定義されます。クラス自体には、x yとzと呼ばれるメンバーと、多くのメソッドがあります。

私はC#でクラス全体を書き直すことができますが、これは問題ではありませんが、2と一致する可能性があります。

のは、以下の機能、たとえばみましょう。とにかく

[DllImport("Engine.dll", EntryPoint = "SetColor", CallingConvention = CallingConvention.Cdecl)] 
static extern void SetColor(Vector3df color); 
[DllImport("Engine.dll", EntryPoint = "GetColor", CallingConvention = CallingConvention.Cdecl)] 
static extern Vector3df GetColor(); 

が存在する私は、この作品のようなコードを作ることができる:

extern "C" void SetColor(Vector3df color) 
extern "C" Vector3df GetColor() 

は、私はC#で、このようなものを持っていると思います?

私は決してC#の達人ではないことに注意してください。マーシャリングに関しては失われています。私は主にQtやwxWidgetsを習得することなくゲームのための地図エディタを作るためにこれをやっています。

ありがとうございました!

答えて

2

あなたがする必要があるのは、C++ dllで期待されるものと同等のバイナリレイアウトを持つC#構造体を定義することだけです。無梱包で唯一のX、Y、Zを仮定すると、それは...ちょうどあなたが与えてくれたCおよびC#の関数シグネチャで動作するはず

[StructLayout(LayoutKind.Sequential)] //Required, as default layout is Auto 
struct Vector3df { 
    public float x, y, z; 
} 

をです。 C++クラスのメソッドをp/invokeできないため、Vector3dfクラスのメソッドを呼び出そうとすると、問題が発生します。 Set/GetColorで行ったように、各メソッドを単純なC関数としてラップする必要があります。

大きなライブラリをインポートしようとすると、ラッパーを作成するのにC++/CLIを使用する方が簡単かもしれません。もう1つの選択肢はcxxiを使用して調査することですが、これを使用する経験はありません。

+0

私はそのようなことを書くことができますが、クラスを使用し、いくつかのメソッドを含めることができますか?私はC#でベクトル関数を書き直しても問題ありません。 – Sanctus2099

+0

クラスを使用することができ、メソッドを追加できます。ネイティブクラスが期待しているものとは異なるバイナリ表現を与えるフィールドを追加しないでください。 –

1

最も簡単な方法は、管理されていないC++クラス間の変換を行う別のC++/CLIラッパーDLLを作成することです。

関連する問題