Новое в 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);
Если он важен для контекста, функция принимает массив байтов 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 ++: он содержит довольно сложные манипуляции с данными внутри и легко десятилетий выполнения, гарантируя, что все работает правильно.
Заранее спасибо!
Указатель в C / C ++ похож на ссылку в C # (слово «out», которое допускает изменения). Объедините его с массивами, и это даст вам:
public short Carryout(out byte[] dataBlock, out ushort[] ch1s, out ushort[] ch2s, out ushort[] ch3s, out byte[] cepa, out ushort[] tac);
Других решений пока нет …