У меня есть сторонняя библиотека, в которой есть множество функций, которые принимают буфер char[] и длину буфера int и заполняют этот буфер строкой. Итак, вызывающая сторона отвечает за выделение массива char, а затем вызывающая сторона передает вызываемой стороне указатель на первый элемент этого массива char и максимальный размер строки, которую он может туда поместить.
Я хочу обернуть эти функции с помощью SWIG, чтобы можно было вызывать их из C#. В идеале я хочу, чтобы оболочка просто возвращала объект string. Например, предположим, что функция имеет такую подпись:
Код: Выделить всё
void get_a_string(char* input_str, int input_str_len);
Мне бы хотелось, чтобы интерфейс C# был просто
Я еще не смог осознать это. Первым делом я попробовал включить библиотеку arrays_csharp.i, которая мне показалась подходящей. В частности, попытка использовать %apply char INOUT[] {char* input_str}. Результатом этого является предупреждение 453: невозможно применить (char INOUT[]). Никакие карты типов не определены. Я объясняю это просто непониманием карт типов.
Помимо этого, тогда память, которую я выделяю в C#, должна быть доступна в C, и я знаю, что это не сработает. Но я решил, что могу добавить код в функции C с помощью %typemap(in), который будет выделять для меня память перед вызовом библиотечной функции. Но даже если это сработает, в функции все равно будут параметры, и я не знаю, как от них избавиться.
Далее я придумал, что, возможно, я не хочу просто %include "mylibrary.h", а вместо этого в моем файле интерфейса должна быть определена функция C, которая будет:
- Выделять память для символа array
- Вызовите функцию get_a_string()
- Верните указатель только на массив
А затем сопоставьте выходной символ* этой функции, определенный в файле интерфейса, со строкой C#. Я могу попробовать, но в этой библиотеке есть сотни функций, которые ведут себя таким образом, и написание всех этих оберток будет муторным занятием. Если это единственный вариант, я могу это сделать, но, судя по документации, SWIG, вероятно, уже решил эту проблему. Итак, что я неправильно понял? Это правильный способ сделать это? Или есть какой-нибудь умный способ использовать карты типов для большей автоматизации?
Подробнее здесь:
https://stackoverflow.com/questions/797 ... arp-string