2009-03-23 13 views
8

DLLImportを使用してC++コードをC#から呼び出すことができるすべての例は、intsを前後に渡します。私はそれらの例をうまく動作させることができます。私は呼び出しが必要なメソッドは、そのインポートパラメータとして2つの構造体を取る、と私はこの仕事をどのようにすることができますはっきりとは分かりません。私はC++のコードを所有C#でDLLImportを構造体のパラメータとして使用するにはどうすればよいですか?

ので、私は私がする必要があること、それに変更/追加を行うことができます。ここでは

私はで動作するように持っているものです。

サードパーティのアプリケーションが起動時にDLLを読み込み、DLLExportが特定の方法で定義されることを期待しているため、エクスポートされたメソッドシグネチャを実際に変更することはできません。

ビルドされているC#アプリはラッパーとして使用されるので、このC++ピースを他のアプリケーションに統合することができます。これらのアプリケーションはすべてC#で書かれています。

私が呼び出す必要がC++メソッドのシグネチャは、この

DllExport int Calculate (const MathInputStuctType *input, 
    MathOutputStructType *output, void **formulaStorage) 

のように見え、MathInputStructTypeは、あなたが投稿宣言から次

typedef struct MathInputStuctTypeS { 
    int    _setData; 
    double    _data[(int) FieldSize]; 
    int    _setTdData; 
} MathInputStuctType; 

答えて

4

として定義され、あなたのC#コードは次のようになります:

[DllImport("mydll.dll")] 
static extern int Calculate(ref MathInputStructType input, 
    ref MathOutputStructType output, ref IntPtr formulaStorage); 

MathInputStructTypの構造によってはeとMathOutputStructTypeをC++で使用する場合、それらの構造体宣言も正しくマーシャリングするように属性を設定する必要があります。構造体の

+0

関数名btw :) – leppie

+0

が存在しません。これらの構造体宣言も正しく整列するように属性を設定する必要があります。 これは私が実際に理解していない部分です。私は私の質問に構造体を追加しました。 –

3

struct MathInputStuctType 
{ 
    int  _setData; 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = FieldSize)] 
    double[] _data; 
    int  _setTdData; 
} 
+0

100%が必要かどうか分かりませんが、ArraySubTypeを_dataフィールドのUnmanagedType.R8に設定する必要があります。 – JaredPar

+0

それは推定されるべきです(私は、マーシャラーがかなり良いと仮定します)。 – leppie

2

あなたはCodePlexの、http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120にこのプロジェクトで見たいと思うかもしれません。構造体を正しく整列させるのに役立ちます。

+0

これは素晴らしく、すべてが見えますが、私が選んだDLLに関係なく、マニフェストを期待しています。それがうまくいくなら、クールなツールのように見えます。 –

+0

制限があることは分かりませんでしたが、残念です。 – LanceSc

+0

心配しないで、助けてくれてありがとう。 –

関連する問題