Как вызвать метод на указатель на объект C ++, используя OpCodes.Calli

При вызове метода для объекта C ++ из .NET с использованием IL-инструкции .calli как разрешить указатель на фактический метод, который вы хотите вызвать? Я понимаю, что это будет зависеть от платформы.

Я знаю, что отличная библиотека SharpDX широко использует инструкцию .calli, и я заглянул в код, который она генерирует, и указатель на метод получается следующим образом:

((void**)(*(void**)_nativePointer))[69]

где _nativePointer — указатель на экземпляр объекта. Затем его приводят к void **, который отменяет ссылки, а затем снова приводят к void **, который индексируется в слоте 69. Я просто не могу понять, что именно здесь происходит.

3

Решение

Calli код операции будет работать только с объектами, имеющими виртуальные таблицы но не может использоваться со стандартными методами C ++ (не виртуальными). Это также требует, чтобы объекты следовали тому же ABI, таким образом, это работает хорошо с COM, так как он определяет стандартный ABI для доступа к объектам C ++. Но это не будет работать, например, с множественным наследованием C ++.

Чтобы получить доступ к простому методу C ++ для объекта, вам нужно иметь сгенерированную оболочку C, которая предоставляет простую функцию C для каждого метода C ++, где первый параметр обычно является экземпляром объекта C ++, а следующие параметры являются параметрами из Метод C ++ (Некоторые оболочки, такие как CXXI, иногда могут напрямую ссылаться на объекты C ++, следуя компиляторам ABI). Итак, чтобы сделать этот мост, вы можете:

  • Разработайте свою собственную оболочку C (динамическая библиотека DLL /, которая обеспечивает эти функции трансляцией вызовов в объект C ++)
  • SWIG обычно используется для автоматизации такого типа моста C ++ / C #.
  • Была также попытка некоторых людей из Mono создать мост C ++ под названием CXXI, но, похоже, не разработано.
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]