2009-05-06 67 views
9

私はC++ライブラリにC#のから構造体を渡すしようとしています。私は構造体をオブジェクトとして渡し、C++関数はそれをポインタ(void *)として期待しています。構造体へのポインタとして構造体をマーシャリングするにはどうすればよいですか?

私は構造を渡し、問題が生じています。ここで

[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)] 
public static extern IntPtr TheFunction([MarshalAs(UnmanagedType.LPStruct)] UserRec userRec); 

私が得るランタイム例外のテキストです。

は、「『パラメータ#1』をマーシャリングすることはできません:無効(この値の型が構造体とペアにしなければならない)/アンマネージドタイプの組み合わせを管理します。 "

私はこの文脈でLPStructを使用するMSDN記事を見つけましたが、

これは私が元帥にしようとしている私の構造である:

[StructLayout(LayoutKind.Sequential)] 
public struct UserRec { 
    [MarshalAs(UnmanagedType.I4)] 
    public int userParam1; 
} 

これは、C++の関数である:

MOCKVADAVLIB_API tVDACQ_CallBackRec * TheFunction(void * userParams) {... 

答えて

17

がrefパラメータとして構造を渡して試してみてください。

[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)] 
public static extern IntPtr TheFunction(ref UserRec userRec); 

refを構造体と組み合わせて使用​​すると、概念的にアドレスが渡されます。これまでならば

+4

この場合でも[マーシャル]は必要ありませんと思います。 –

+0

@Antonは、あなたが正しいです(更新) – JaredPar

+0

終了作業結果: パブリック静的にexternのIntPtr TheFunction([MarshalAs(UnmanagedType.Struct)、あり】REF UserRec userRec)。 [MurshalAs]は明示的にするだけですが、必須ではありません。 –

13

ちなみに、UnmanagedType.LPStructは、めったに正しいMarshalAs引数ではありません。間接の余分なレベルで管理されていないGUIDとして可能System.Guid値の型を処理する

UnmanagedType.LPStructが唯一の特定のケースのためにサポートされていますマイクロソフトの従業員であるA quote from Adam Nathan

+0

しかし、私はそれがPROPERTYKEYのために働くことを望んでいた:。。 '( – jnm2

+0

はところで、これがそうである理由の説明のためのおかげでそれは私が本当に欲しかったものだ – jnm2

+0

(私は署名に 'ref'を使用しなく、この狂気は何で、待って?コールサイトで!C#言語ではCOMインターフェイスの例外が必要ですか?) – jnm2

関連する問題