Впервые в C ++ / WinRT и возникли некоторые проблемы с маршалингом данных при попытке экспортировать один класс C ++ с помощью C ++ / WinRT для использования в приложении .Net.
Я создал компонент среды выполнения Windows C ++ (Windows Universal) в Visual Studio 2017 v15.7.4.
Это сигнатура функции C ++, которую я пытаюсь использовать, поскольку она существует в файле заголовка, который я скопировал в проект C ++ / WinRT.
public:
short Carryout(unsigned char* p, unsigned short* pCh1, unsigned short* pCh2, unsigned short* pCh3, unsigned char* pCePa, unsigned short* pTAc);
Если это важный контекст fot, функция принимает массив байтов p в качестве входных данных и выводит 5 массивов, производных от него: pCh1, pCh2, pCh3, pCePa, pTAc.
Теперь в приложении .Net я объявил новый экземпляр класса из WinRT и настроил все буферы в качестве примера:
byte[] dataBlock = GetDataBlock();
ushort[] ch1s = new ushort[4096];
ushort[] ch2s = new ushort[4096];
ushort[] ch3s = new ushort[4096];
byte[] cepa = new byte[4096];
ushort[] tac = new ushort[1024];
WinRTClass wrtClass = new WinRTClass();
short x = wrtClass.Carryout(dataBlock, out ch1s, out ch2s, out ch3s, out cepa, out tac);
VS сообщает мне, что это неверно, потому что подпись не совпадает. Проверка определения функции переноса вызывает (что я предполагаю) автоматически сгенерированный файл заголовка (в его описании есть "из метаданных"), и подпись функции переноса в нем совершенно другая:
public short Carryout(out byte p, out ushort pCh1, out ushort pCh2, out ushort pCh3, out byte pCePa, out ushort pTAc);
Обратите внимание, что аргументы функции не являются массивами, а являются типами byte / ushort. Кроме того, первый аргумент не должен быть типом out
. Как правильно устранить это несоответствие с помощью этого автоматически сгенерированного заголовка?
Я бы предпочел не вносить никаких изменений в код C ++: он имеет внутри довольно сложные манипуляции с данными и легко обеспечивает десятилетия выполнения, гарантируя, что все работает правильно.
Заранее спасибо!