Присвоение значений адресуемой пользовательской структуре в c #, вызываемой из неуправляемого cpp - PullRequest
0 голосов
/ 01 сентября 2018

Рассмотрим следующую структуру

 /*Structure defined in unmanaged dll written in cpp*/
 struct NSCASR_RCG_RES_ST
 {
 unsigned int ulSizeBytes;
 unsigned int ulWarnings;
 unsigned short usNumPhrases;
 wchar_t* pstrWaveformURI;
 unsigned int ulWaveformSizeBytes;
 unsigned int ulWaveformDuration;
 };

 /*Structure defined in c#*/
 struct NSCASR_RCG_RES_ST
 {

 unsigned int ulSizeBytes;
 unsigned int ulWarnings;
 unsigned short usNumPhrases;
 String pstrWaveformURI;
 unsigned int ulWaveformSizeBytes;
 unsigned int ulWaveformDuration;
 };

В моей немагирующей DLL (cpp) я вызываю функцию, передавая адрес структуры следующим образом:

 NSCASR_RCG_RES_ST result_recognize;
 ASR_Recognize_ResultsGet(&result_recognize);

В моей управляемой DLL это определение похоже на

 void ASR_Recognize_ResultsGet(NSCASR_RCG_RES_ST *recognize)
 {
 /*MRCP_MD_TO_ASR is namespace and Constants is class name
   which consists of structure NSCASR_RCG_RES_ST */

    MRCP_MD_TO_ASR::Constants::NSCASR_RCG_RES_ST *pRecognitionResults;
    pRecognitionResults = (MRCP_MD_TO_ASR::Constants::NSCASR_RCG_RES_ST *)recognize;
    MRCP_MD_TO_ASR::ASR_API::ASR_Recognize_ResultsGet(*pRecognitionResults);
 }

В коде c # я назначаю следующих членов

 public static int ASR_Recognize_ResultsGet(ref Constants.NSCASR_RCG_RES_ST pRecognitionResults)
 {
     pRecognitionResults = speech_results;
     pRecognitionResults.ulSizeBytes = 200;
     return 0;
 }

Но когда я вижу содержимое result_recognize после выполнения оператора значение 200 присваивается переменной usNumPhrases вместо ulSizeBytes

1 Ответ

0 голосов
/ 19 сентября 2018

Я получил решение, добавив structlayout как явное и используя charset, так как c # использует Unicode 16, мы должны сделать его Unicode 8, если мы используем концепции IntPtr

 [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)]
    public struct NSCASR_RCG_PHRASE_ST
    {
        [FieldOffset(0)]
        public ushort usConfidence;
        [FieldOffset(2)]
        public ushort usNumItems;
        [FieldOffset(4)]
        public short sGrammarIndex;
        [FieldOffset(6)]
        public short sGrammarType;
    }


    [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)]
    public unsafe struct NSCASR_RCG_RES_ST
    {

        [FieldOffset(0)]
        public uint ulSizeBytes;
        [FieldOffset(4)]
        public uint ulWarnings;
        [FieldOffset(8)]
        public ushort usNumPhrases;
        [FieldOffset(12)]
        public IntPtr pstrWaveformURI;
        [FieldOffset(16)]
        public uint ulWaveformSizeBytes;
        [FieldOffset(20)]
        public uint ulWaveformDuration;
    }
...