0

P/Invoke を使用して、サード パーティのネイティブ DLL でいくつかの関数を呼び出そうとしています。しかし、FatalExecutionEngine エラーが発生し続けます。おそらく、データのマーシャリングに対して何らかの間違いを犯していますか?

これは私が使用しようとしているネイティブ関数です:

__declspec(dllexport) void dw_mm_directional_spectrum_initialise(
    struct dw_mm_directional_spectrum_T* directional_spectrum
    , const enum dw_buoy_type_T buoy_type
    , const unsigned char status[ /* NULL || sample_count */ ]
    , const double v[ /* sample_count */ ]
    , const double n[ /* sample_count */ ]
    , const double w[ /* sample_count */ ]
    , const unsigned int sample_count);

これは、ポインターを介して返されるネイティブ構造体です。

struct dw_mm_directional_spectrum_T{
    signed char error_code;
    double* c_vv;
    double* c_nn;
    double* c_ww;
    double* c_nw;
    double* q_vn;
    double* q_vw;
    unsigned short output_size;
    double fraction_of_segments_used;
    unsigned char* list_of_used_segments;
    unsigned short list_of_used_segments_size;
};

これは、C# プログラムの構造体定義です。

[StructLayout(LayoutKind.Sequential)]
struct datawell{
    Byte error_code;
    double[] c_vv;
    double[] c_nn;
    double[] c_ww;
    double[] c_nw;
    double[] q_vn;
    double[] q_vw;
    ushort output_size;
    double fraction_of_segments_used;
    IntPtr list_of_used_segments;
    ushort list_of_used_segments_size;
};

私の DLLimport 署名:

[DllImport("libwaves.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void dw_mm_directional_spectrum_initialise(
    out datawell dw,
    Byte buoy_type,
    Byte[] status,
    double[] v,
    double[] n,
    double[] w,
    ushort sample_count);

これが私の C# プログラムで関数を使用する方法です。

double[] vertical = new double[512]; 
double[] north = new double[512];
double[] west = new double[512];
Byte[] status = new Byte[512];
datawell dw_test = new datawell();
ushort cnt = 512;

//dummy data generation
for(int i=0;i<512;i++){
    status[i]=1;
    vertical[i]=i*1.0;
    north[i]=i*1.0;
    west[i]=i*1.0;
}

dw_mm_directional_spectrum_initialise(out dw_test,0,status, vertical, north,west,cnt);

どんな助けでも大歓迎です。

よろしく、

ゼール

4

2 に答える 2

1

list_of_used_segmentsunsigned char*は、C およびdouble[]C#と同じように定義されています。

于 2013-07-09T14:14:29.300 に答える