Під час роботи з міжмовними додатками, особливо тими, що написані на різних мовах програмування, можуть виникати складнощі з конвертацією даних. Однією з таких проблем є конвертація вказівника С++ в об’єкт в С#. Давайте розглянемо цей випадок докладніше.
1 |
Не вдається отримати правильні дані під час конвертації вказівника С++ в об'єкт в С#. У мене є API у вигляді С++ dll, я передаю вказівник на структуру, делегат та об'єкт у це API. API додає деякі дані у структуру, а пізніше структуру у об'єкт, і у dll викликається делегат, адреса об'єкта передається у делегат для вилучення даних у С#. Проблема полягає в тому, що під час конвертації адреси вказівника в екземпляр об'єкта показується неправильна інформація, вона відображає дані, які я передавав раніше у API. Пряме приведення неможливе, наприклад, як у Delphi Request(ptr). У мене є код на Delphi, який може бути використаний для посилання. Я використовував кілька методів, таких як GCHandle, щоб закріпити об'єкт на всю операцію - у стані Pinned він видає помилку про використання типу даних blittable, я не можу змінити тип даних для звичайного GCHandle, він показує ті самі дані, як і метод marshal. Marshal для виділення пам'яті та конвертації ptrtostructure, а пізніше в делегаті structuretoptr відображає неправильні дані. |