C # вызывает функцию go в dll, и она выполняется в .Net Core, будет ли собираться мусор из неуправляемой памяти, выделенной go?

#c# #go #.net-core #garbage-collection

#c# #Вперед #.net-core #сборка мусора

Вопрос:

Я пишу интерфейс передачи файлов в Go, который принимает информацию о localpath и удаленном сервере, а затем передает файл по частям. Ситуация такова, что я хочу использовать ее в C #, и я узнаю, что Go может быть встроен в C-Shared dll и вызываться в C # с помощью P / Invoke. Я хочу знать, будет ли собираться мусор из неуправляемой памяти, выделяемой go? Если нет, есть ли способ освободить эту часть памяти?

Ответ №1:

Сборщик мусора не будет знать о неуправляемой памяти кода Go.

Если вы хотите освободить ее, вам следует управлять ею в коде Go или, по крайней мере, подготовить функцию для вызова на C # и удалить неуправляемую память.

Мой совет был бы:

  • Функция в Go, которая освобождает память
  • Затем вызовите эту функцию в C #, когда вы хотите удалить объект.

Комментарии:

1. У вас это сработало? Не забудьте принять ответ, если он сработал.

2. извините, у меня все еще есть несколько вопросов: поскольку golang собран с мусором, поэтому у него нет функции для освобождения собственной памяти, такой как фрагмент или массив байтов, как будет использоваться эта память? Итак, у меня нет способа вызвать funcs для освобождения памяти go в C #.

3. Когда вы передаете управляемый тип, golang обработает его. Обычно управляемые языки отправляют копию значения, если вы экспортируете функцию (как вы делаете в C #). Но в вашем случае, я думаю, что это по-другому, потому что вы отправляете поток байтов файла на C #. Если вы откроете поток, вы также сможете закрыть его.