开发者

declaring a pointer in c# to point to unmanaged structure in c dll

I am stuck with one issue that I have not been able to solve for two days.

The error message looks as below:

Cannot take the address of, get the size of, or declare a pointer to a managed type ('Control_Vertilon.Imports.PHOTONIQ_CONFIG_TABLE')

Below is the code,

         UInt16[] Arguments = new UInt16[PHOTONIQ_ARG_BUFF_SZ];

         PHOTONIQ_CONFIG_TABLE PhotoniqConfigTable = new PHOTONIQ_CONFIG_TABLE();

        UInt16 *cfgPtr = (UInt16*)&PhotoniqConfigTable;       

        for(int i = 0; i < Imports.CONFIG_TABLE_SZ; i++){
            Arguments[i+1] =  *cfgPtr++; 
        }

        Imports.ControlInterface(Opcode, Arguments, 0x1, Imports.TimeoutMs, ref errInNoErrorStruct, ref NumRetArguments, ref PhotoniqConfigTable, Imports.CONFIG_TABLE_SZ, ref errOutStruct);   

where the PhotoniqConfigTable which I marshaled looks as below,

       [StructLayout(LayoutKind.Sequential)]
        unsafe public struct PHOTONIQ_CONFIG_TABLE
        {
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 SystemMode;       //Indicates current system mode, acquire or standby mode 0 = Standby Mode 1 = Acquire Mode
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 HVLimit0;   // Maximum allowed voltage on HV supply 1 Range = 500 ?9250 (50 ?925V)
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 HVLimit1;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 NumChannelsB0;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 NumChannelsB1;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 NumChannelsB2;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 NumChannelsB3;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 HVEnabled;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 HVSetpoint0;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 HVSetpoint1;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 UserConfigID;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 DCRD_AOut_0;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 BandEnables;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band0StartIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band0StopIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band1StartIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band1StopIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band2StartIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band2StopIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band3StartIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band3StopIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band4StartIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band4StopIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band5StartIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band5StopIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band6StartIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band6StopIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band7StartIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band7StopIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 FlagEnables;      // pterm flag enables
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public UInt16[] Flag0Operands;  // flag 0 operands: 64 bits
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public UInt16[] Flag1Operands;  // flag 0 operands: 64 bits
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public UInt16[] Flag2Operands;  // flag 0 operands: 64 bits
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public UInt16[] Flag3Operands;  // flag 0 operands: 64 bits
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public UInt16[] Flag4Operands;  // flag 0 operands: 64 bits
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public UInt16[] Flag5Operands;  // flag 0 operands: 64 bits
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public UInt16[] Flag6Operands;  // flag 0 operands: 64 bits
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public UInt16[] Flag7Operands;  // flag 0 operands: 64 bits
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 PTerm0;               // flag 0 - 7 product terms
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 PTerm1;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 PTerm2;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 PTerm3;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 PTerm4;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 PTerm5;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 PTerm6;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 PTerm7;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 DataFilterEnable; // 1 = enable spectral filtering, 0 = disable
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 ProcessingEnables;    // bit 0 = spect filt, bit 1 = gain, 2 = bkgnd sub.
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 TimestampEnable;  // 1 = enable time stamp, 0 = disable
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 DACspare;
            [MarshalAs(UnmanagedType.I4)]
            public Int32 TimestampInterval; //
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 CustomWordsEnable;    // 1/0
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 EventCustomCount; //
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 RESERVED;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 ImageAcqMode;     // 1 = image, 0 = particle
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 InputTrigThresh;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 InputTrigChannel; // 
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 RangeErrorEnable; // 1 = enable range error, 0 = disable
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 CrossBankConfig;  //
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 ReportPackingMode;    //
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 GPOutputEnable;       //
            [MarshalAs(UnmanagedType.I4)]
            public Int32 GPOutputDelay;     //
            [MarshalAs(UnmanagedType.I4)]
            public Int32 GPOutputPeriod;        //
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 IntBoxcarEnable;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 BoxcarWidthEnable;
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public Int32[] ResetDelay;
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public UInt16[] TrigSource;
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public Int32[] TrigPeriod;
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public Int32[] IntegPeriod;
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public Int32[] IntegDelay;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 SibSel0;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 SibSel1;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 SibSel2;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 SibSel3;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 SibSel4;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 SibSel5;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 SibSel6;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 SibSel7;
            [MarshalAs(UnmanagedType.I4)]
            public Int32 TriggerEndCount;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 TrigStampSelect;
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public UInt16[] DataFormat;     // 4 banks: 0 = 17bit sign/mag, 1 = 16bit 2's, comp, 2 = 16b, 2's 1/2 scale
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 7)]
            public UInt16[] RESERVED1;
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 256)]
            public UInt16[] GainArray;
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 256)]
            public UInt16[] TrigThreshArray;
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 16)]
            public UInt16[] TrigEnableArray;    // 256 bits, 1/0 for each channel (max of 256 channels)
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 322)]
            public UInt16[] RESERVED2;          //  678-999
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 250)]
            public UInt16[] CustomArray;            // user custom space: 1000-1249
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 567)]
            public UInt16[] FactoryArray;           // start of factory table
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 32)]
            public SByte[] ModelNumber;         // model number
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 151)]
            public UInt16[] FactoryArray1;      // last piece of factory table
        }  

The problem is, I thought I made the structure unmanaged type yet compiler saying it is managed type.

Or it could be that the UInt16 pointer pointing such way is wrong in managed code.

The buffer Argument[] is in 16bit and that's the passing argument in the dll function so I have stick with 16bit whether using as pointer or buffer to move data.

It would be a tremendous help if anybody can help how to solve this problem.

I have searched web yet could not find precise answer.

Thanks in advance.

==================================================================================

Hi thanks for the reply,

Here I receive different errors with code below:

        fixed (UInt16 *cfgPtr = (UInt16*)&PhotoniqConfigTable){
            //modify config table, then send it back up to PhotoniQ
            PhotoniqConfigTable.NumChannelsB0 = 6;
            PhotoniqConfigTable.IntegPeriod[0] = per;
            PhotoniqConfigTable.TrigPeriod[0] = 100000;
            PhotoniqConfigTable.TrigStampSelect = 1;
            PhotoniqConfigTable.TimestampEnable = 0;
            PhotoniqConfigTable.RangeErrorEnable = 0;
            PhotoniqConfigTable.DataFormat[0] = 0;
            PhotoniqConfigTable.GPOutputEnable = 1;
            PhotoniqConfigTable.GPOutputDelay = 10;
            PhotoniqConfigTable.GPOutputPeriod = 1000;

            for (int i = 0; i < Imports.CONFIG_TABLE_SZ; i++)
            {
                Arguments[i + 1] = *cfgPtr++;
            }
        }      

The error messages are:

Cannot assign to 'cfgPtr' because it is a 'fixed variable'.

The right hand side of a fixed statement assignment may not be a cast expression.

You cannot use fixed size buffers contained in unfixed expressions. Try using the fixed statement. (Three same errors for different lines)

anybody who can explain to me will be great help since I am in short of time.

The structure now looks as below:

        [StructLayout(LayoutKind.Sequential)]
        unsafe public struct PHOTONIQ_CONFIG_TABLE
        {
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 SystemMode;       //Indicates current system mode, acquire or standby mode 0 = Standby Mode 1 = Acquire Mode
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 HVLimit0;   // Maximum allowed voltage on HV supply 1 Range = 500 ?9250 (50 ?925V)
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 HVLimit1;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 NumChannelsB0;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 NumChannelsB1;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 NumChannelsB2;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 NumChannelsB3;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 HVEnabled;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 HVSetpoint0;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 HVSetpoint1;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 UserConfigID;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 DCRD_AOut_0;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 BandEnables;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band0StartIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band0StopIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band1StartIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band1StopIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band2StartIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band2StopIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band3StartIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band3StopIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band4StartIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band4StopIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band5StartIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band5StopIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band6StartIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band6StopIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band7StartIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 Band7StopIndex;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 FlagEnables;      // pterm flag enables
            //[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public fixed UInt16 Flag0Operands[4];   // flag 0 operands: 64 bits
            //[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public fixed UInt16 Flag1Operands[4];   // flag 0 operands: 64 bits
            //[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public fixed UInt16 Flag2Operands[4];   // flag 0 operands: 64 bits
            //[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public fixed UInt16 Flag3Operands[4];   // flag 0 operands: 64 bits
            //[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public fixed UInt16 Flag4Operands[4];   // flag 0 operands: 64 bits
            //[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public fixed UInt16 Flag5Operands[4];   // flag 0 operands: 64 bits
            //[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public fixed UInt16 Flag6Operands[4];   // flag 0 operands: 64 bits
            //[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public fixed UInt16 Flag7Operands[4];   // flag 0 operands: 64 bits
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 PTerm0;               // flag 0 - 7 product terms
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 PTerm1;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 PTerm2;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 PTerm3;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 PTerm4;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 PTerm5;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 PTerm6;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 PTerm7;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 DataFilterEnable; // 1 = enable spectral filtering, 0 = disable
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 ProcessingEnables;    // bit 0 = spect filt, bit 1 = gain, 2 = bkgnd sub.
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 TimestampEnable;  // 1 = enable time stamp, 0 = disable
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 DACspare;
            [MarshalAs(UnmanagedType.I4)]
            public Int32 TimestampInterval; //
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 CustomWordsEnable;    // 1/0
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 EventCustomCount; //
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 RESERVED;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 ImageAcqMode;     // 1 = image, 0 = particle
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 InputTrigThresh;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 InputTrigChannel; // 
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 RangeErrorEnable; // 1 = enable range error, 0 = disable
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 CrossBankConfig;  //
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 ReportPackingMode;    //
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 GPOutputEnable;       //
            [MarshalAs(UnmanagedType.I4)]
            public Int32 GPOutputDelay;     //
            [MarshalAs(UnmanagedType.I4)]
            public Int32 GPOutputPeriod;        //
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 IntBoxcarEnable;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 BoxcarWidthEnable;
            //[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public fixed Int32 ResetDelay[4];
            //[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public fixed UInt16 TrigSource[4];
            //[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public fixed Int32 TrigPeriod[4];
            //[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public fixed Int32 IntegPeriod[4];
            //[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public fixed Int32 IntegDelay[4];
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 SibSel0;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 SibSel1;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 SibSel2;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 SibSel3;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 SibSel4;
            [MarshalAs(UnmanagedType开发者_如何学编程.U2)]
            public UInt16 SibSel5;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 SibSel6;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 SibSel7;
            [MarshalAs(UnmanagedType.I4)]
            public Int32 TriggerEndCount;
            [MarshalAs(UnmanagedType.U2)]
            public UInt16 TrigStampSelect;
            //[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
            public fixed UInt16 DataFormat[4];      // 4 banks: 0 = 17bit sign/mag, 1 = 16bit 2's, comp, 2 = 16b, 2's 1/2 scale
            //[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 7)]
            public fixed UInt16 RESERVED1[7];
            //[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 256)]
            public fixed UInt16 GainArray[256];
            //[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 256)]
            public fixed UInt16 TrigThreshArray[256];
            //[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 16)]
            public fixed UInt16 TrigEnableArray[16];    // 256 bits, 1/0 for each channel (max of 256 channels)
            //[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 322)]
            public fixed UInt16 RESERVED2[322];         //  678-999
            //[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 250)]
            public fixed UInt16 CustomArray[250];           // user custom space: 1000-1249
            //[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 567)]
            public fixed UInt16 FactoryArray[567];          // start of factory table
            //[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 32)]
            public fixed SByte ModelNumber[32];         // model number
            //[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 151)]
            public fixed UInt16 FactoryArray1[151];
            //public fixed UInt16 FactoryArray1[151];       // last piece of factory table
        };  


A second answer, to answer your second question:

The error messages are:

Cannot assign to 'cfgPtr' because it is a 'fixed variable'.

The right hand side of a fixed statement assignment may not be a cast expression.

You cannot use fixed size buffers contained in unfixed expressions. Try using the fixed statement. 

The error messages are telling you what is wrong. Read them.

Cannot assign to 'cfgPtr' because it is a 'fixed variable'.

You are assigning to it here:

Arguments[i + 1] = *cfgPtr++;

Once you initialize a variable containing a pointer that points to a fixed-in-space block you cannot change that variable because you might be changing it to point to a not-fixed-in-space block. In order to prevent this common bug, C# stops you from modifying that variable.

If you want to modify the variable, create a different variable instead. Set it equal to cfgPtr and then modify that variable. Make sure you do it correctly; you are now responsible for ensuring that you keep the pointer pointing to something that is fixed.

The right hand side of a fixed statement assignment may not be a cast expression.

In my last answer I told you to read section 18.7 of the specification, which states that the "fixed" statement takes:

A simple-name or member-access that references a fixed size buffer member of a moveable variable

A cast expression is not a "simple name or member access". A cast expression is a cast expression. And this cast doesn't even make sense! A pointer to a structure is not a pointer to ushort!

Remove the cast. Change the expression in the initializer to be a member access to a fixed-size buffer member of a moveable variable.

You cannot use fixed size buffers contained in unfixed expressions. Try using the fixed statement.

You're using a fixed-size buffer directly. You can't do that. You can only use a fixed-size buffer by obtaining a pointer to it. Again, this is part of the safety system that ensures that you don't accidentally access a fixed-in-size buffer that is not fixed-in-place. Stop trying to access the buffer directly. Obtain a pointer to the buffer and access it via the pointer.

anybody who can explain to me will be great help since I am in short of time.

Let me be very clear on this point: you have turned the managed safety system off and the correctness of your program and the stability of the process are now your problem, not the managed runtime's problem. If you do not understand everything about how to safely manage your own pointers, stop what you are doing and read up on it until you do understand it. By rushing now and writing a whole lot of code that you do not understand, you are risking having to deal with horrible bugs later. This is no time to be in a hurry.

Begin by reading all of chapter 18. Only once you thoroughly understand all that stuff should you attempt to write complicated unsafe code.


You've said how the arrays are to be laid out in unmanaged memory but have not said how they are to be laid out in managed memory. The compiler therefore believes that you have a bunch of references to garbage-collected managed memory in that struct -- all those arrays -- and will not let you take a pointer to it as a result.

I suspect that you intended those arrays to be fixed-size buffers, not managed arrays, yes?

You'll want to read the C# specification, section 18.7, to understand how fixed-size buffers work in structs.

Note also that there is a big difference between a "fixed in size" array and a "fixed in place" object pointed to by a pointer; those are two completely different usages of the word "fixed". Many people get them confused, particularly since to correctly and safely use a "fixed in size" buffer, the memory of the buffer must be "fixed in place".


Instead of

        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 151)]
        public UInt16[] FactoryArray1;

say

        public unsafe fixed ushort FactoryArray1[151];

because arrays "look" different in managed and unmanaged memory, but fixed-size buffers "look" the same (i.e. are blittable).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜