2010-11-18 9 views
1

C#のDLLからC関数を呼び出すだけです。このC関数は構造体を返します。ここでCで関数を呼び出して戻り値として構造体を返す

CのDLLの.hのファイルの宣言:

typedef struct t_Point{ 
int x; 
int y; 
} Point; 


Point myFuncs(); 

は、今私はC#で、この機能を使用します。 Wrapper.cs:

using System.Text; 
using System.Runtime.InteropServices; 

namespace CSharp_mit_OpenCV 
{ 
    [StructLayout(LayoutKind.Sequential)] 
    public struct Point 
    { 
     public int x; 
     public int y; 
    }; 

    class Wrapper 
    { 
     [DllImport("OpenCV Test.dll", CharSet= CharSet.Auto)] 
     [return: MarshalAs(UnmanagedType.Struct)] 
     public static extern Point myFuncs(); 
    } 
} 

次のように使用がある:

Point p = Wrapper.myFuncs(); 

(ネーミングは、おそらく最良ではない)

myFuncsのみ、構造体を宣言Xにいくつかの値を置くとyとそれを返します。問題:C#で得られる値は、C関数で生成された値とは異なります。 4と2で、0と111226272です。ここで問題は何ですか?

ありがとうございました!

+0

型の違いがあると思います: 'int'の代わりにC#' short'を試し、 'uint'または' ushort'を試してみてください。プロセスによって出力されたバイトを投稿できますか(C#が構造体を作成しようとする前に)? –

+1

いつも111226272が返ってくるのですか、それとも毎回違うのですか? –

+0

呼び出し規約が正しいことを忘れないでください(cdecl/fast-callなど)。ここをクリックしてください:http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention.aspx – plinth

答えて

0

マーシャルコードが正しいようですが、アンマネージドメソッドのパックレイアウトは何ですか? LayoutKind.Sequentialはintを4バイトとして扱います。これが正しいかどうかを確認してください。

関連する問題