Я использую какой-то старый API, и мне нужно передать указатель структуры на неуправляемый код, который работает асинхронно.
Другими словами, после того как я передаю указатель структуры неуправляемому коду, неуправляемый код копирует указатель и немедленно возвращается. Неуправляемый код может получить доступ к этой структуре в фоновом режиме в другом потоке. У меня нет контроля ни над неуправляемым кодом, который выполняется в другом потоке, ни над самим потоком.
Фиксированный оператор { } нельзя использовать для закрепления, так как он не предназначен для асинхронного неуправляемого закрепления.
GCHandle может закреплять только ссылки, поэтому для использования GCHandle структура должна быть упакована. Я попробовал, и это работает. Основная проблема заключается в том, что вы не можете обновить структуру из управляемого кода. Чтобы обновить структуру, в первую очередь нам нужно ее распаковать, затем обновить, затем снова упаковать, но... упс... снова упаковать?!? это означает, что предыдущий указатель в памяти по-прежнему указывает на старую неактуальную структуру, а новая структура имеет другой указатель, и это означает, что мне нужно передать новый указатель на неуправляемый код... неприменимо в моем кейс.
Как я могу закрепить структуру в памяти без фиксированного оператора { } и чтобы я мог обновить ее из управляемого кода без изменения ее указателя?
Спасибо.
Изменить:
Просто подумал... есть ли способ закрепить родительский объект, содержащий структуру, а затем получить указатель на struct, а не на объект-контейнер?