2012-02-21 50 views
1

私はC#プロジェクトで使用したい第三者のc dllを持っています。私は、ファイルのヘッダーを読み取る1つのメソッドをインポートすることができました。今私は、データを読み取るメソッドにアクセスしたいと思います。私は問題が文字列の配列を含む構造体だと思うので、StringBuilderのリスト、文字列のリストを作成して配列として渡したり、文字列配列を直接作成するだけです(以下に示すように)。これで一日を過ごした後、もはや私はもう何をすべきか分かりません。私はちょうど私が(今それがhttp://msdn.microsoft.com/en-us/library/ac7ay120(v=vs.100).aspxにリストされていないので)私は今やっている方法で小数の配列を渡すことができるかどうかもわかりません。 DLLのC#文字列の配列を含む構造体のdllimport

Cヘッダー:

public enum id_retrieve_enum 
{ 
    GET_ID = 1, 
    DO_NOT_GET_ID, // id is in file  
    NO_ID_IN_FILE, 
    CREATE_ID  // id is not in file 
}; 

[StructLayout(LayoutKind.Sequential)] 
public struct id_struct 
{ 
    [MarshalAs(UnmanagedType.SafeArray)] 
    public String[] values; 
    public int size; 
    public id_retrieve_enum retrieve; 
}; 

DLLIMPORT:

[DllImport("libpandconv.dll", CallingConvention = CallingConvention.Cdecl)] 
public static extern int importdata(
    String fullfilename, 
    int numrows, 
    int numcols, 
    int startrow, 
    Decimal[] dataset, 
    [In, Out, MarshalAs(UnmanagedType.Struct)] ref id_struct ids); 

初期化データと呼び出し方法:

Decimal[] data = new Decimal[numpoints * highdim]; 

id_struct ids = new id_struct(); 
    ids.retrieve = (hasid.Equals(1)) ? id_retrieve_enum.GET_ID : id_retrieve_enum.CREATE_ID; 
    ids.values = new String[numpoints]; 

importdata(inputfilename, numpoints, highdim, startrow, data, ref ids); 
列挙および構造体の

enum id_retrieve_enum { 
    GET_ID = 1, 
    DO_NOT_GET_ID, // id is in file 
    NO_ID_IN_FILE, 
    CREATE_ID  // id is not in file 
}; 

struct id_struct { 
    char **values;      // allocated 
    int size;       // optional: DEFAULT_VALUE = NULL_INT 
    enum id_retrieve_enum retrieve; // optional 
}; 

int importdata(char *fullfilename, int numrows, int numcols, int startrow, 
       decimal *dataset, struct id_struct *ids); 

C#コード

inputfilenameは既にマーシャリングされており、numpoints,およびstartrowは既に私がすでにインポートしたメソッドimportheaderによって返されています。

+0

文字列配列の代わりに2次元文字配列を渡そうとしましたか? –

+0

あなたは 'values'に' IntPtr'を使い、手でマーシャリングする必要があります。 C++/CLIレイヤーも可能なルートです。誰がこの文字列を割り当てるのですか?どのように解放される予定ですか? –

+0

私は[これを]試みた(http://stackoverflow.com/questions/1498931/marshalling-array-of-strings-to-char-in-c-must-be-quite-easy-if-you-know-h ) 'IntPtr'を使用していましたが、その時点では動作しませんでした。私は今、もう一度それを試してみるつもりです、ありがとう! –

答えて

2

配列の代わりにIntPtrを使用して手動で解決しようとしましたか?