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);
どんな助けでも大歓迎です。
よろしく、
ゼール