2015-06-02 3 views
0

Состав 1:Как выделить память для массива структуры в C#

typedef struct _wfs_cdm_cu_info 
{ 
    USHORT usTellerID; 
    USHORT usCount; 
    LPWFSCDMCASHUNIT * lppList; 
} WFSCDMCUINFO, * LPWFSCDMCUINFO; 

Структура 2:

typedef struct _wfs_cdm_cashunit 
{ 
    USHORT usNumber; 
    USHORT usType; 
    LPSTR lpszCashUnitName; 
    CHAR cUnitID[5]; 
    CHAR cCurrencyID[3]; 
    ULONG ulValues; 
    ULONG ulInitialCount; 
    ULONG ulCount; 
    ULONG ulRejectCount; 
    ULONG ulMinimum; 
    ULONG ulMaximum; 
    BOOL bAppLock; 
    USHORT usStatus; 
    USHORT usNumPhysicalCUs; 
    LPWFSCDMPHCU * lppPhysical; 
} WFSCDMCASHUNIT, * LPWFSCDMCASHUNIT; 

Состав 3:

typedef struct _wfs_cdm_physicalcu 
{ 
    LPSTR lpPhysicalPositionName; 
    CHAR cUnitID[5]; 
    ULONG ulInitialCount; 
    ULONG ulCount; 
    ULONG ulRejectCount; 
    ULONG ulMaximum; 
    USHORT usPStatus; 
    BOOL bHardwareSensor; 
} WFSCDMPHCU, * LPWFSCDMPHCU; 

C# Структура: -

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential, CharSet=System.Runtime.InteropServices.CharSet.Ansi, Pack = 1)] 
public struct WFSCDMPHCU {  [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)] 
public string lpPhysicalPositionName;[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=5)] 
public string cUnitID; 
public uint ulInitialCount; 
public uint ulCount; 
public uint ulRejectCount; 
public uint ulMaximum; 
public ushort usPStatus; 
public int bHardwareSensor; 
} 

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential, CharSet=System.Runtime.InteropServices.CharSet.Ansi, Pack = 1)] 
    public struct WFSCDMCASHUNIT { 
    public ushort usNumber; 
    public ushort usType;   [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)] 
    public string lpszCashUnitName;[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=5)] 
    public string cUnitID;  [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=3)] 
    public string cCurrencyID; 
    public uint ulValues; 
    public uint ulInitialCount; 
    public uint ulCount; 
    public uint ulRejectCount; 
    public uint ulMinimum; 
    public uint ulMaximum; 
    public int bAppLock; 
    public ushort usStatus; 
    public ushort usNumPhysicalCUs; 
    public System.IntPtr lppPhysical; 
    } 

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)] 
public struct WFSCDMCUINFO {  
public ushort usTellerID;  
public ushort usCount;  
public System.IntPtr lppList; 
} 

DllImport

[DllImport(@"Dispenser.dll")] 
public static extern int CDM_SetCashUnit(out WFSCDMCUINFO cuinfo); 

1) Моя основная проблема: Как мне распределить или выделить память для этой структуры для отправки данных с C# на C++, вторая и третья структура являются массивом структуры ???

2) Если я использую указатель, насколько он эффективен.

3) Если используется оболочка C++/CLI, то как я мог бы получить к ней доступ через C#.

Прошло много времени, и я еще не понял, как мне заполнить массив структур на C#.

Follwing код, что я пытаюсь выяснить ...

Marshal Код:

Облицовочные ошибку "чтобы определить расширение не общий статический класс"

public static IntPtr GetIntPtr(this object obj) { 
      try { 
       var handle = GCHandle.Alloc(obj, GCHandleType.Pinned); 
       var thread = new Thread(() => { 
        Thread.Sleep(20000); 
        handle.Free(); 
       }); 
       thread.Start(); 

       return handle.AddrOfPinnedObject(); 
      } catch (ArgumentException) { 
       var ptr = Marshal.AllocHGlobal(Marshal.SizeOf(obj)); 

       Marshal.StructureToPtr(obj, ptr, false); 

       return ptr; 
      } 
     } 

     public static T FromIntPtr<T>(this IntPtr ptr) { 
      if (ptr == IntPtr.Zero) 
       return default(T); 

      return (T) Marshal.PtrToStructure(ptr, typeof (T)); 
     } 

Дана ссылка на код C++, как я назвал функцию.link

+0

Затем, пожалуйста, напишите код, который вы написали, когда попытались реализовать решение, и опишите, что произошло, чтобы мы могли помочь вам определить причину, по которой он не работает. – phoog

+0

@phoog: Я не понимаю, как маршалировать эту структуру, ну, я получаю ошибку метода расширения, когда я отправляю предыдущий код ссылки. Я cnt создаю класс static, потому что он воздействует на другие созданные функции – TechBrkTru

+0

есть ли какой-либо другой способ выделения структуры ??? @phoog – TechBrkTru

ответ

0

Это моя структура отображения в C#:

[StructLayout(LayoutKind.Sequential)] 
public struct Message 
{ 
    public uint MsgId; 
    public uint DLC; 
    public uint Interval; 
    public uint Handle; 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] 
    public byte[] Data; 
}; 

C++ здесь:

struct Message { 
    unsigned int MsgId; 
    unsigned int DLC; 
    unsigned int Interval; 
    unsigned int Handle; 
    unsigned char Data[64]; 

};

Мой метод в C++, который нуждается в такой структуры в качестве параметра:

extern "C" __declspec(dllexport) int _stdcall MessageWrapper(Message *msg) 

Вот как я называю этот метод из C#:

  Message frame = new Message(); 
      frame.MsgId = (uint)MsgId; 
      frame.DLC = (uint)Dlc; 
      frame.Interval = (uint)Interval; 
      frame.Data = new byte[64]; 


      int rawsize = Marshal.SizeOf(frame); 
      IntPtr frameBuffer = Marshal.AllocHGlobal(rawsize); 
      Marshal.StructureToPtr(frame, frameBuffer, false); 

Вызвать метод здесь:

  int response = HwWrapper.MessageWrapper(frameBuffer); 

Возможно, у вас есть некоторые изменения, сделанные на C++, и вы можете прочитать их здесь, в C#:

  frame = (Message)(Marshal.PtrToStructure(frameBuffer, typeof(Message))); 


      Marshal.FreeHGlobal(frameBuffer); 
+0

Ну, это для простой структуры, как насчет массива структур ??? atleast для третьего strucutre .... @ Olaru Mircea – TechBrkTru

+0

Действительно, мой пример не выполняет этого, но вот ответ: https://social.msdn.microsoft.com/Forums/vstudio/en-US/dcfd6310-b03b- 4552-b4c7-6c11c115eb45/pass-array-of-struct-with-array-from-c-to-c? Forum = clr –

+0

Что такое hwWrapper в приведенном выше коде ??? @Olaru Mircea – TechBrkTru

Смежные вопросы