2010-11-18 9 views
1

C#의 DLL에서 C 함수를 호출하기 만하면됩니다. 이 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 바이트로 취급합니다. 이것이 올바른지 확인하십시오.

관련 문제