0

C#アプリによって呼び出されているC DLLがあり、pinvokeを使用してデータを交換しています。以下では、intと2つのchar配列で構成される単純なクラスがあります。C#はDLLを正しく呼び出し(「getStreamGroup」を使用)、DLLは渡されたstreamGroup構造体に正しいデータを入力します。

ただし、C関数が実行され、C#側に戻ると、渡されて正しいデータで埋められたstreamGroupは不毛になります。3つのnull値です。VS2010からのエラー/警告はありません。これは64ビットアプリです。何か案は?

#define STREAM_COUNT 9000

typedef struct s_streamGroup
{
    int systemDefinedGroup;

    char name[BUFFER_SIZE_128];
    char streamList[STREAM_COUNT];

} streamGroup;


public class streamGroup
{
    public int systemDefinedGroup;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = constants.BUFFER_SIZE_128)]
    public byte[] name;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = constants.STREAM_COUNT)]
    public byte[] streamList;
}


DLL int getStreamGroup( int groupIndex, streamGroup *RequestedStreamGroup)
{   
    *RequestedStreamGroup = Environment.StreamGroup[groupIndex];
    return(DLL_NO_ERROR);
}

[DllImport(constants.DLL_PATH, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern int getStreamGroup([In] int groupIndex, [In, Out] streamGroup group);
4

1 に答える 1

0

streamGroupの前に[StructLayout(LayoutKind.Sequential)]が必要です。

それでも不十分な場合は、コードをもう少し明確にしてください。どのプロジェクトにどのコードが含まれているかわかりません(正しく理解していれば、ネイティブC ++プロジェクトとC#プロジェクトがあります)。どちらがどちらであるかを示す2つの別々のリストを提供するか、私の理解が正しくない場合はあなたが何をしているのかを説明してください。

于 2012-09-24T23:36:42.627 に答える