2012-02-09 4 views
0

두 가지 인수를 가진 C++의 메소드가 있습니다 : byte와 ushort는 매우 어려운 구조체에 대한 포인터를 반환합니다 (이는 C++ 프로젝트에 제시된 거의 모든 구조체의 조합입니다).PInvoke 어드레싱

C#에서 DllImport를 사용하여이 메서드를 호출하면 (예 : 1과 2를 전달할 때) 임의의 바이트 번호와 1을 사용하여 호출합니다 (따라서 첫 번째 인수는 두 번째 인수로 전달되고 실제 첫 번째 인수는 일부 메모리의 다른 주소).

반환 구조에 대해 생각할 수있는 유일한 설명은 올바르게 매핑되지 않았기 때문에 모든 매개 변수에 오프셋이 있습니다. 하지만 어떻게 확인해야할지 모르겠다. 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에 대한 코드의 구조를 주석 한 후 # 나는 시험이 코드를 감소

C# :

enum PrimitiveType : ushort 
enum ErrorType : byte 

    [StructLayout(LayoutKind.Sequential)] 
    public struct GetRelayCfmType 
    { 
     public PrimitiveType Primitive; 
     public byte InstNo;       /* The instance number. */ 
     public ErrorType ErrorCode;   /* RTX2300_ERR_NO_ERROR */ 
     public byte Active;      /* True = relay active */ 
    }; 

Marshal.Sizeof (새 GetRelayCfmType()) == 6.

왜 크기가 1 바이트가 다른가요? 업데이트.

__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 

지금 사진이 가득

지금 내 기능 (C++)입니다.

+3

1 단계 : Google에서 도와 줄 충분한 코드를 보여줍니다. –

+0

http://clrinterop.codeplex.com/releases/view/14120을 사용하여 DLLimport 코드가 올바른지 확인 했습니까? –

+0

그건 100+ 구조와 같습니다.함수가 매우 간단하다고 말했기 때문에 byte와 ushort를 받아 들인다. 반환 값은 자식이다. 그것들은 100 개가 넘는 구조들로 만들어진 노동 조합입니다. 또한 NDA 때문에 업로드 할 수 없으며 문제가 어디인지 모르기 때문에 전송할 수 없습니다. 그래서 문제가있는 곳을 알려주지 말고 문제 해결 방법을 몇 가지 예를 들어 설명해주십시오. – Archeg

답변

0

도움을 요청하기 전에 더 많은 정보가 필요합니다. 이 기사를보십시오 : http://msdn.microsoft.com/en-us/library/eahchzkf(v=vs.100).aspx 만들어진 진술을 주목하십시오.

Marshal.SizeOf 메서드를 사용할 수 있지만 에 의해 반환 된 값은 sizeof에서 반환 한 값과 항상 같지는 않습니다. Marshal.SizeOf는 형식이 마샬링 된 후 크기를 반환하지만 sizeof는 패딩을 포함하여 공용 런타임에 할당되어 크기를 반환합니다.

구조 내의 패딩으로 인해 의심됩니다. .NET에서 Sequential 레이아웃으로 구조를 허용했습니다. 이것은 당연히 특정 상황을 짐작할 수있게합니다. 명시 적을 사용하면 값을 설정하고 심지어는 크기 값을 설정합니다.