3

私はCでこの構造を持っています

struct system_info
{  
   const char *name;     
   const char *version;  
   const char *extensions; 
   bool        path;    
};

そして、この関数シグネチャ

void info(struct system_info *info);

この関数を次のように使用しようとしています。

[DllImport("...")]
unsafe public static extern void info(info *test);



[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public unsafe struct info
{
    public char *name;
    public char *version;
    public char *extensions;

    public bool path;
} 

そして私のメインで:

info x = new info();
info(&x);

エラーが発生しました。ポインターはマーシャリングされた構造体を参照できません。これを管理するにはどうすればよいですか?

4

2 に答える 2

3

ここで使用する必要はまったくありませんunsafe。私はこのようにします:

public struct info
{
    public IntPtr name;
    public IntPtr version;
    public IntPtr extensions;
    public bool path;
}

そして、関数は次のとおりです。

[DllImport("...")]
public static extern void getinfo(out info value);

Cdeclネイティブコードによっては、呼び出し規約を指定する必要がある場合があります。

次のような関数を呼び出します。

info value;
getinfo(out value);
string name = Marshal.PtrToStringAnsi(value.name);
// similarly for the other two strings fields

投稿したネイティブコードには文字列の長さについての言及がないため、文字列はネイティブコードによって割り当てられ、割り当てを解除するために何もする必要はないと想定しています。

于 2013-02-09T08:40:51.897 に答える
0

ハンス・パッサントが述べたように、*testの代わりにrefを使用して解決しました

[DllImport("...")]
unsafe public static extern void info(ref system_info test);
于 2013-02-09T03:02:38.957 に答える