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