두 가지 인수를 가진 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++)입니다.
1 단계 : Google에서 도와 줄 충분한 코드를 보여줍니다. –
http://clrinterop.codeplex.com/releases/view/14120을 사용하여 DLLimport 코드가 올바른지 확인 했습니까? –
그건 100+ 구조와 같습니다.함수가 매우 간단하다고 말했기 때문에 byte와 ushort를 받아 들인다. 반환 값은 자식이다. 그것들은 100 개가 넘는 구조들로 만들어진 노동 조합입니다. 또한 NDA 때문에 업로드 할 수 없으며 문제가 어디인지 모르기 때문에 전송할 수 없습니다. 그래서 문제가있는 곳을 알려주지 말고 문제 해결 방법을 몇 가지 예를 들어 설명해주십시오. – Archeg