Cisco TSP - миграция инструмента с 32-битной на 64-битную в C# - PullRequest
1 голос
/ 06 августа 2020

В настоящее время у меня возникла проблема, заключающаяся в том, что мне нужно перенести инструмент, который обменивается данными через Cisco TAPI. В настоящее время он работает под 32-битной компиляцией.

Если я переключу компиляцию на 64-битную и обновлю пакет nuget «ATAPI» (от Марка Смита <2>) до 64-битной версии.

Если я построю это и протестирую, в журналах TAPI будет записано несоответствие dwSize. Я попытался установить Explicity StructLayout для CiscoDevSpecifi c -структуры (например, предложенный здесь <1>). Но та же ошибка появляется в файле журнала.

сообщение об ошибке

15:44:51.105 |   TSPI_lineGetAddressStatus() TSPI_lineGetAddressStatus returns = 0x00000000
15:44:51.106 |   TSPI_lineDevSpecific() 
        dwRequestID: 0x000105AF  hdLine: 0x175B4B30  dwAddressID: 0x00000000  hdCall: 0x00000000  lpParams: 0x202D6E98  dwSize: 32
15:44:51.106 |   CSelsiusTSPLine::DevSpecific() [0x00000D32] *ERROR* dwSize mis-match 0x00000020
15:44:51.106 |   TSPI_lineDevSpecific() TSPI_lineDevSpecific returns = 0x80000048

например, структура для StartCallMonitotoring выглядит как

    [StructLayout(LayoutKind.Explicit, Size = 32)]
    public struct CiscoLineDevSpecificStartCallMonitoring
    {
        [FieldOffset(0)]
        public int m_MsgType;
        [FieldOffset(8)]
        public int m_PermanentLineID;
        [FieldOffset(16)]
        public int m_MonitorMode; //0= NONE, 1=SILENT, 2=WHISPER, 3=ACTIVE
        [FieldOffset(24)]
        public int m_ToneDirection; //0=LOCALONLY, 1=REMOTEONLY, 2=BOTH, 3=NOTLOCALORREMOTE
    }

инициализация как

var cisco = new CiscoLineDevSpecificStartCallMonitoring
{
    m_MsgType = (int)CiscoLineDevSpecificType.SLDST_START_CALL_MONITORING,
    m_PermanentLineID = permanentIdOfTargetLine,
    m_MonitorMode = (int)monitorMode,
    m_ToneDirection = (int)PlayToneDirection.PlayToneDirectionNoLocalOrRemote
};

И расчет байтов выглядит так:

private static byte[] GetBytes(object msg)
{
    var size = Marshal.SizeOf(msg);
    var arr = new byte[size];
    var ptr = Marshal.AllocHGlobal(size);

    Marshal.StructureToPtr(msg, ptr, true);
    Marshal.Copy(ptr, arr, 0, size);
    Marshal.FreeHGlobal(ptr);

    return arr;
}

Спасибо за ваш ответ.

<1> https://community.cisco.com/t5/collaboration-documents/tsp-x64-devspecific-dword-size-mismatch-problem/ta-p/3613828 <2 > https://github.com/markjulmar/atapi.net

...