Hi all!
I am trying to code something more efficient, and so, I try do not use a loop in order to marshal the data which the app receives.
It throws an exception which I do not know how to handle it.
Does someone can help me?
I attach here a piece of relevant code and the error message. During the execution of this line:
Marshal.PtrToStructure(dst, finputDoublebuffer);
it occurs an exception.
Thank you in advance
Gustavo
Code:public class ds_param_value_buffer : Object { public ds_param_value_buffer(int sz) { values = new ds_param_value[sz]; } public ds_param_value [] values; }; ... public class DS { private ds_param_value_buffer finputDoublebuffer; public DS() { ... finputDoublebuffer = new ds_param_value_buffer((int)Constants.DSMAXDATAVISINPUTPARAMS); } public static IntPtr IntPtr_Offset(IntPtr src,int offset) { switch (IntPtr.Size) { case 4: return new IntPtr(src.ToInt64() + offset); case 8: return new IntPtr(src.ToInt64() + offset); default: throw new NotSupportedException("This is running on a machine where pointers are " + IntPtr.Size ); } } private void MarshalIncommingData(){ // manual marshalling to convert native incomming data to managed data IntPtr dst; dst = IntPtr_Offset(funmanagedinputbuffer,0); ///////////////// Marshal.PtrToStructure(dst, finputDoublebuffer); //ERROR HERE ///////////////// return; } private ds_status handle_data() { ... switch(status){ case ds_status.DS_OK: // Do manual marshalling of the incomming data MarshalIncommingData(); if (fOnEvtData != null) { // Fire "on data" event EvtDataArgs args = new EvtDataArgs(timestamp, ref finputDoublebuffer); fDispatcher.Invoke(DispatcherPriority.Normal, fOnEvtData, this, args); args = null; } break; ... }//switch ... return status; } ... }Code:Error Message: System.ArgumentException was unhandled Message="The specified structure must be blittable or have layout information.\r\nParameter name: structure" Source="mscorlib" ParamName="structure" StackTrace: at System.Runtime.InteropServices.Marshal.PtrToStructureHelper(IntPtr ptr, Object structure, Boolean allowValueClasses) at System.Runtime.InteropServices.Marshal.PtrToStructure(IntPtr ptr, Object structure) at DSI.DS.MarshalIncommingData() in DS.cs:line 827 at DSI.DS.handle_data() in DS.cs:line 847 at DSI.DS.handle_event(ds_dv_event_type evt, StringBuilder errmsgbuf) in DS.cs:line 980 at DSI.DS.ds_evt_deamon() in DS.cs:line 1024 at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() InnerException:




Reply With Quote