В целом, пользователи .NET вашей библиотеки не будут передавать динамически созданные массивы вашим функциям. Насколько я знаю, все контейнеры в .NET собраны мусором.
Несмотря на это, вам нужно будет сделать управляемую обертку для вашего неуправляемого кода. Есть много учебников и статей по этому вопросу, here is one to start with. .
При написании оберток .NET для несвязаного кода я обнаружил, что вы хотите больше сосредоточиться на сохранении функциональности, чем на том, чтобы сделать каждую функцию доступной в .NET. В вашем примере может быть лучше просто иметь управляемую обертку, копирует массив в неуправляемую память и выполняет все операции, которые вам нужны внутри библиотеки. Таким образом, вам не придется делать какие-либо закрепления управляемой памяти или Маршаллинга удалось неуправляемой памяти, чтобы обойти сбор мусора .NET времени выполнения. Однако, как вы реализуете управляемую обертку действительно зависит от того, что цель этой функции.
Если вы действительно хотите реализовать эту функцию для функции в .NET, вам нужно будет посмотреть на Marshal class in .NET for taking control of managed memory in unmanaged code. для принятия контроля над управляемой памятью в неуправляемом коде.
Для функции обратного вызова сначала необходимо создать делегатов .NET, которые могут быть назначены в управляемом коде. Затем вам нужно будет сделать неуправляемую бесплатную функцию внутренней для вашей библиотеки, которая называется неуправляемой версией функции пута. Эта неуправляемая бесплатная функция будет отвечать за вызов управляемого делегата, если назначенный ему пользователь.