объявление указателя в c #, указывающего на неуправляемую структуру в c dll

#c#

#c#

Вопрос:

Я застрял с одной проблемой, которую я не мог решить в течение двух дней.

Сообщение об ошибке выглядит следующим образом:

Невозможно получить адрес, получить размер или объявить указатель на управляемый тип (‘Control_Vertilon.Импортирует.PHOTONIQ_CONFIG_TABLE’)

Ниже приведен код,

          UInt16[] Arguments = new UInt16[PHOTONIQ_ARG_BUFF_SZ];

         PHOTONIQ_CONFIG_TABLE PhotoniqConfigTable = new PHOTONIQ_CONFIG_TABLE();

        UInt16 *cfgPtr = (UInt16*)amp;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);   
  

где photoniqconfigurable, который я маршалировал, выглядит следующим образом,

        [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
        }  
  

Проблема в том, что я думал, что сделал структуру неуправляемым типом, но компилятор говорит, что это управляемый тип.

Или может быть, что указатель UInt16, указывающий таким образом, неверен в управляемом коде.

Аргумент buffer[] находится в 16 бит, и это передающий аргумент в функции dll, поэтому я придерживаюсь 16 бит, независимо от того, используется ли он в качестве указателя или буфера для перемещения данных.

Было бы огромной помощью, если бы кто-нибудь мог помочь решить эту проблему.

Я искал в Интернете, но не смог найти точного ответа.

Заранее спасибо.

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

Привет, спасибо за ответ,

Здесь я получаю разные ошибки с кодом ниже:

         fixed (UInt16 *cfgPtr = (UInt16*)amp;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  ;
            }
        }      
  

Сообщения об ошибках:

Невозможно присвоить ‘cfgPtr’, потому что это ‘фиксированная переменная’.

Правая часть назначения фиксированного оператора может не быть приведенным выражением.

Вы не можете использовать буферы фиксированного размера, содержащиеся в незафиксированных выражениях. Попробуйте использовать оператор fixed. (Три одинаковые ошибки для разных строк)

любой, кто может мне объяснить, будет очень полезен, так как у меня мало времени.

Теперь структура выглядит следующим образом:

         [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
        };  
  

Комментарии:

1. Я рекомендую в будущем, когда у вас возникнет дополнительный вопрос к существующему вопросу, опубликовать новый вопрос . Вы получите гораздо больше внимания к новому вопросу, чем к редактированию старого.

Ответ №1:

Второй ответ, чтобы ответить на ваш второй вопрос:

Сообщения об ошибках:

 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. 
  

Сообщения об ошибках сообщают вам, что не так. Прочитайте их.

Невозможно присвоить ‘cfgPtr’, потому что это ‘фиксированная переменная’.

Вы присваиваете ему здесь:

 Arguments[i   1] = *cfgPtr  ;
  

После инициализации переменной, содержащей указатель, который указывает на блок с фиксированным пространством, вы не можете изменить эту переменную, потому что вы можете изменить ее, чтобы указать на блок с нефиксированным пространством. Чтобы предотвратить эту распространенную ошибку, C # запрещает изменять эту переменную.

Если вы хотите изменить переменную, создайте вместо нее другую переменную. Установите его равным cfgPtr , а затем измените эту переменную. Убедитесь, что вы делаете это правильно; теперь вы несете ответственность за то, чтобы указатель указывал на то, что исправлено.

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

В моем последнем ответе я сказал вам прочитать раздел 18.7 спецификации, в котором говорится, что оператор «fixed» принимает:

Простое имя или доступ к элементу, который ссылается на элемент буфера фиксированного размера подвижной переменной

Приведенное выражение не является «простым именем или доступом к элементу». Приведенное выражение — это приведенное выражение. И это приведение даже не имеет смысла! Указатель на структуру не является указателем на ushort!

Удалите приведение. Измените выражение в инициализаторе, чтобы оно было доступом члена к элементу буфера фиксированного размера подвижной переменной.

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

Вы используете буфер фиксированного размера напрямую. Вы не можете этого сделать.Вы можете использовать буфер фиксированного размера, только получив указатель на него. Опять же, это часть системы безопасности, которая гарантирует, что вы случайно не получите доступ к буферу фиксированного размера, который не является фиксированным на месте. Прекратите попытки прямого доступа к буферу. Получите указатель на буфер и получите к нему доступ через указатель.

любой, кто может мне объяснить, будет очень полезен, так как у меня мало времени.

Позвольте мне прояснить этот момент: вы отключили управляемую систему безопасности, и корректность вашей программы и стабильность процесса теперь являются вашей проблемой, а не проблемой управляемой среды выполнения.Если вы не все понимаете о том, как безопасно управлять своими собственными указателями, прекратите то, что вы делаете, и читайте дальше, пока не поймете это. Торопясь сейчас и написав кучу кода, который вы не понимаете, вы рискуете столкнуться с ужасными ошибками позже. Сейчас не время спешить.

Начните с прочтения всей главы 18. Только после того, как вы полностью разберетесь во всем этом, вы должны пытаться писать сложный небезопасный код.

Комментарии:

1. Мне нравятся все эти причины, по которым правила сделаны такими. Жаль, что я не могу услышать больше о них из других источников.

Ответ №2:

Вы сказали, как массивы должны быть размещены в неуправляемой памяти, но не сказали, как они должны быть размещены в управляемой памяти. Поэтому компилятор считает, что у вас есть куча ссылок на собранную из мусора управляемую память в этой структуре — все эти массивы — и в результате не позволит вам получить указатель на нее.

Я подозреваю, что вы предполагали, что эти массивы будут буферами фиксированного размера, а не управляемыми массивами, да?

Вам нужно прочитать спецификацию C #, раздел 18.7, чтобы понять, как буферы фиксированного размера работают в структурах.

Обратите внимание также, что существует большая разница между массивом «фиксированного размера» и объектом «фиксированный на месте», на который указывает указатель; это два совершенно разных использования слова «фиксированный». Многие люди путают их, особенно потому, что для правильного и безопасного использования буфера «фиксированного размера» память буфера должна быть «зафиксирована на месте».

Ответ №3:

Вместо

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

скажем

         public unsafe fixed ushort FactoryArray1[151];
  

потому что массивы «выглядят» по-разному в управляемой и неуправляемой памяти, но буферы фиксированного размера «выглядят» одинаково (т. Е. Являются изменяемыми).