2012-02-09 7 views
0

私は、2つの引数byteとushortを持つC++のメソッドを持っています。これは非常に難しい構造体へのポインタを返します(これはC++プロジェクトのほぼすべての構造体の集合体です)。PInvoke addressing

私はこのメソッドをC#でDllImportを使って呼び出すと、例えば1と2を渡すと、ランダムなバイト番号と1で呼び出されます(最初の引数が2番目に渡され、メモリの異なるアドレス)。

リターン構造について私が考えることができる唯一の説明は正しくマップされていないため、すべてのパラメータにオフセットがあります。しかし、私はそれを確認する方法を知らない。 C#で生成されたマーシャリングされたデータのアドレスとサイズを表示できるツールはありますか?C++で受け取ったアドレスでそれらを確認できますか?またはあなたが提案できる他の解決策。 C++:

enum PrimitiveType: unsigned short 
enum ErrorType : unsigned char 

typedef struct 
{ 
    PrimitiveType Primitive; 
    unsigned char InstNo;  /* The instance number. */ 
    ErrorType ErrorCode;   /* ERR_NO_ERROR */ 
    unsigned char Active;      /* True = relay active */ 
} GetRelayCfmType; 

はsizeof(GetRelayCfmType)= 5

---更新---

C++やCのコード構造をコメントした後#Iは、試験これにコードを低下しました

C#:

Marshal.Sizeof(新しいGetRelayCfmType())== 6.

なぜ1バイトでサイズが異なるのですか? 更新。

今私の関数は(C++)である:

__declspec(dllexport) GetRelayCfmType __stdcall GetRelay_Blocking(unsigned char InstNo, RelayNoType No) 

enum RelayNoType : unsigned char 

ので、私が持っているC#で:

[DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)] 
    public static extern GetRelayCfmType GetRelay_Blocking(byte InstNo, RelayNoType No); 

enum RelayNoType : byte 

今、絵がいっぱいです。

+3

ステップ1:私たちが手助けをするための十分なコードを示してください。 –

+0

http://clrinterop.codeplex.com/releases/view/14120を使用してDLLimportコードが正しいことを確認しましたか? –

+0

これは100+構造に似ています。私が言ったように、関数は非常に簡単です - それはバイトとushortを受け入れ、戻り値は悪魔です。それは100以上の構造から作られた組合です。また、NDAのためにアップロードすることはできません。問題がどこにあるのか分からないため、NDAをアップロードすることはできません。だからこそ私はあなたに問題がどこにあるのかを指摘しないように頼んでいますが、そのような問題のデバッグ方法の例を教えてください。 – Archeg

答えて

0

私たちのヘルプをリクエストする前に、より多くの情報が必要です。この記事を見て:http://msdn.microsoft.com/en-us/library/eahchzkf(v=vs.100).aspxは、作成されたステートメントに注意してください。

あなたはMarshal.SizeOfメソッドを使用できますが、この方法 によって返される値は、常にはsizeofで返される値と同じではありません。 Marshal.SizeOfは、型がマーシャリングされた後のサイズを返します。 sizeofは、埋め込みを含む共通の 言語ランタイムによって割り当てられたサイズを返します。

私は構造内のパディングのためにその疑いがあります。構造に.NETからシーケンシャルレイアウトを許可しました。これにより、もちろん、特定の事柄を推測することができます。私は明示的を使用して、パックの値を設定します。おそらくさらにの値の値を設定します。