を渡すと、私はC#で初心者本当にMA:私はいくつかの複雑な構造体とCのDLLを持っているCおよびC#(DLLおよびPの呼び出し)の間に構造体の配列を含む構造体
typedef struct {
int a;
int b;
} simple_struct;
typedef struct {
int d;
int e;
simple_struct f[20];
short g;
simple_struct h[20];
short i;
} complex_struct;
問題は、私はということです私のC#アプリケーションとこの構造とのインタフェースができません! DLLで
は、機能のGetData(complex_struct *体mystruct)があると私はC#のからそれを呼び出すshoudので、私が作成:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
unsafe struct simple_struct {
public int a;
public int b;
} ;
[StructLayout(LayoutKind.Sequential, Pack = 1)]
unsafe struct complex_struct {
public int d;
public int e;
public simple_struct[] f;
public short g;
public simple_struct[] h;
public short i;
} ;
しかし、問題は、私はGetDataのの引数としてcomplex_structを渡す際に、すべてのフィールドがsimple_structの私の2つの配列(Iをfとhを意味する)私を形成するが、ないバック満たされています!彼らの価値はヌルです!
いくつかのいずれかが、私を助けてくださいおかげ
こんにちはとお返事に感謝、
することができます私はあなたが言ったように行っているが、私はGetDataメソッドを呼び出すときに、私はまだ別の問題があり、任意のメッセージなしでプロセスがクラッシュした(例外の種類):これは私のCシャープコードが
ある: 名前空間dll_test_import_c_sharp {クラスプログラム { [StructLayout(LayoutKind.Sequential、パック= 1)] 構造体simple_struct { 公共のint。 公共int型のB; };
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct complex_struct {
public int d;
public int e;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public simple_struct[] f;
public short g;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public simple_struct[] h;
public short i;
} ;
[DllImport("test_dll.dll", CharSet = CharSet.Unicode)]
static extern int GetData(ref complex_struct a);
static void Main(string[] args)
{
complex_struct a = new complex_struct();
GetData(ref a);
return;
}
}
}
私はprintfのたくさんの私のGetDataを行っていると、それらのすべてがうまく実行され、それは復帰 "命令がクラッシュしたように思えます!
私はあなたが言ったように行っている
こんにちはとお返事に感謝、
...参照するか、外でのGetDataを呼び出すために、それらの両方が動作しませんみましたが、私はまだ任意のメッセージ(例外の一種)することなく、私はGetDataメソッドを呼び出す別の問題、プロセスがクラッシュを持っている:
これは私のCシャープコードです: 名前空間dll_test_import_c_sharp { クラスプログレラム {[StructLayout(LayoutKind.Sequential、パック= 1)] 構造体simple_struct { 公共のint。 公共int型のB; };
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct complex_struct {
public int d;
public int e;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public simple_struct[] f;
public short g;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public simple_struct[] h;
public short i;
} ;
[DllImport("test_dll.dll", CharSet = CharSet.Unicode)]
static extern int GetData(ref complex_struct a);
static void Main(string[] args)
{
complex_struct a = new complex_struct();
GetData(ref a);
return;
}
}
}
私はprintfのたくさんの私のGetDataを行っていると、それらのすべてがうまく実行され、それは復帰 "命令がクラッシュしたように思えます!
私がrefまたはアウトでのGetDataを呼び出すために、それらの両方が動作しませんみました...
によってだということを指定するには、
struct
上の配列定義を変更する必要がありますか?ネイティブ構造体がパックされるのはむしろ珍しいことです。 –梱包は私のプログラムでさらに使用するためのものです。 – hzrari
私は分かりません。ネイティブ構造体がパックされていない場合は、interopが失敗する可能性があります。 –