При вызове метода для объекта C ++ из .NET с использованием IL-инструкции .calli как разрешить указатель на фактический метод, который вы хотите вызвать? Я понимаю, что это будет зависеть от платформы.
Я знаю, что отличная библиотека SharpDX широко использует инструкцию .calli, и я заглянул в код, который она генерирует, и указатель на метод получается следующим образом:
((void**)(*(void**)_nativePointer))[69]
где _nativePointer — указатель на экземпляр объекта. Затем его приводят к void **, который отменяет ссылки, а затем снова приводят к void **, который индексируется в слоте 69. Я просто не могу понять, что именно здесь происходит.
Calli
код операции будет работать только с объектами, имеющими виртуальные таблицы но не может использоваться со стандартными методами C ++ (не виртуальными). Это также требует, чтобы объекты следовали тому же ABI, таким образом, это работает хорошо с COM, так как он определяет стандартный ABI для доступа к объектам C ++. Но это не будет работать, например, с множественным наследованием C ++.
Чтобы получить доступ к простому методу C ++ для объекта, вам нужно иметь сгенерированную оболочку C, которая предоставляет простую функцию C для каждого метода C ++, где первый параметр обычно является экземпляром объекта C ++, а следующие параметры являются параметрами из Метод C ++ (Некоторые оболочки, такие как CXXI, иногда могут напрямую ссылаться на объекты C ++, следуя компиляторам ABI). Итак, чтобы сделать этот мост, вы можете:
Других решений пока нет …